在 Symfony3/Doctrine2 中初始化多对多关系
Initialize a Many-To-Many relationship in Symfony3/Doctrine2
已编辑:多对多关系而不是一对多
给定实体:用户 & 项目。
Item 有一个布尔值 属性 命名为:$mandatory.
User 与 Many-To-Many Items.
在一个新的用户的creation/construction,他必须关联(初始化)到每个 项目 已将 ($mandatory) 属性 设置为 true。
在 Symfony3/Doctrine2 中确保这些要求的最佳做法是什么?
创建事件订阅者,如下所述:
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);
}
}
}
}
希望对您有所帮助。
已编辑:多对多关系而不是一对多
给定实体:用户 & 项目。
Item 有一个布尔值 属性 命名为:$mandatory.
User 与 Many-To-Many Items.
在一个新的用户的creation/construction,他必须关联(初始化)到每个 项目 已将 ($mandatory) 属性 设置为 true。
在 Symfony3/Doctrine2 中确保这些要求的最佳做法是什么?
创建事件订阅者,如下所述:
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);
}
}
}
}
希望对您有所帮助。