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

时间:2017-09-17 13:30:05

标签: symfony doctrine-orm symfony-2.3

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

给定实体:用户&的档案

项目有一个名为: $必需的布尔属性。

用户多对多 相关。

在创建/构建新的用户时,他必须与(每个 相关(初始化)($必须)属性设置为true。

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

2 个答案:

答案 0 :(得分:3)

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

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函数(如果您只想创建)检查它是否是User对象,从数据库中获取必需的所有项并将它们添加到User Entity。

答案 1 :(得分:0)

我来到这个解决方案,灵感来自@ kunicmarko20的上述提示。

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

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

以下是代码:

<?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);

            }   
        }
    }
}

我希望这会有所帮助。