在 Symfony3/Doctrine2 中初始化多对多关系

Initialize a Many-To-Many relationship in Symfony3/Doctrine2

已编辑:多对多关系而不是一对多

给定实体:用户 & 项目

Item 有一个布尔值 属性 命名为:$mandatory.

UserMany-To-Many Items.

在一个新的用户的creation/construction,他必须关联(初始化)到每个 项目 已将 ($mandatory) 属性 设置为 true。

在 Symfony3/Doctrine2 中确保这些要求的最佳做法是什么?

创建事件订阅者,如下所述:

http://symfony.com/doc/current/doctrine/event_listeners_subscribers.html#creating-the-subscriber-class

public function getSubscribedEvents()
{
    return array(
        'prePersist',
    );
}

public function prePersist(LifecycleEventArgs $args)
{
    $entity = $args->getObject();

    if ($entity instanceof User) {
        $entityManager = $args->getEntityManager();
        // ... find all Mandatody items and add them to User
    }
}

添加 prePersist 函数(如果你只想创建)检查它是否是用户对象,从数据库中获取所有必需的项目并将它们添加到用户实体。

我想到了这个解决方案,受到上面@kunicmarko20 的提示的启发。

我必须订阅 preFlush() 事件,然后,通过 PreFlushEventArgs 使用 UnitOfWork 对象 用于获取计划插入的实体的参数。

如果我遇到此类实体的 User 实例,我只需向其中添加所有 mandatory 项。

代码如下:

<?php
// src/AppBundle/EventListener/UserInitializerSubscriber.php
namespace AppBundle\EventListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\PreFlushEventArgs ;

use AppBundle\Entity\User;
use AppBundle\Entity\Item;


class UserInitializerSubscriber implements EventSubscriber
{
    public function getSubscribedEvents()
    {
        return array(
            'preFlush',
        );
    }

    public function preFlush  (PreFlushEventArgs  $args)
    {
        $em     = $args ->getEntityManager();
        $uow    = $em   ->getUnitOfWork();


         // get only the entities scheduled to be inserted
        $entities   =   $uow->getScheduledEntityInsertions();
        // Loop over the entities scheduled to be inserted    
        foreach ($entities as $insertedEntity) {
            if ($insertedEntity  instanceof User) {
                $mandatoryItems = $em->getRepository("AppBundle:Item")->findByMandatory(true);
                // I've implemented an addItems() method to add several Item objects at once                    
                $insertedEntity->addItems($mandatoryItems);

            }   
        }
    }
}

希望对您有所帮助。