将实体添加到工作单元

时间:2018-04-03 17:46:37

标签: php doctrine-orm

我有一个持久化的实体,在某些情况下,需要创建其他实体并将其保留。

当前用例是在EasyAdminBundle的列表视图中切换布尔属性时我需要创建实体并在该属性设置为true时保留它们。

我想在preUpdate事件中这样做,因此我看了一下工作单元界面并尝试了解它。

我可以访问以下方法:

$event->getEntityManager()->getUnitOfWork()->getScheduledEntityUpdates()

$event->getEntityManager()->getUnitOfWork()->getScheduledEntityInsetions()

所以,我转储了这些内容并为实体更新了一个条目并为插入清空了数组。

然后添加新实体:

$entity = new Entity();
$event->getEntityManager()->getUnitOfWork()->scheduleForInsert($entity);

毕竟我再次倾倒了计划更新和插入的entites,并且所有内容都正确。

array:1 [▼
  "000000006b3c425d000000005d5d714c" => Entity {#1045 ▶}
]

插入计划中此实体的数组键与更新计划中的特征相同。

不幸的是,没有执行插入查询。

是否有一种方法(乍一看似乎)将对象添加到当前工作单元以修改数据以在preUpdate事件中更新/保留?

编辑(听众代码):

/**
     * @param Market $market
     * @param LifecycleEventArgs $event
     * @throws \Doctrine\ORM\ORMException
     */
    public function preUpdate(Market $market, LifecycleEventArgs $event)
    {
        $uow = $event->getEntityManager()->getUnitOfWork();
        $changeset = $event->getEntityManager()->getUnitOfWork()->getEntityChangeSet($market);

        if(isset($changeset['boolean_field']) && count($changeset['boolean_field']) == 2){
            if(!$changeset['boolean_field'][1]){//THIS IS NO CONCERN AT THE MOMENT
                $activations = $event->getEntityManager()->getRepository('BaseMapping:MarketWatchedByUser')
                    ->findBy(['market' => $market]);

                foreach ($activations as $a) {
                    $event->getEntityManager()->remove($a);
                }
            }
            else{//THIS IS WHAT IS BEING TESTED
                $users = $event->getEntityManager()->getRepository('UserBundle:User')
                    ->findAll();

                foreach ($users as $u) {
                    $activation = new MarketWatchedByUser();
                    $activation->setUser($u);
                    $activation->setMarket($market);
                    dump($event->getEntityManager()->getUnitOfWork()->isScheduledForInsert($activation));
                    $event->getEntityManager()->getUnitOfWork()->scheduleForInsert($activation);
                    dump($event->getEntityManager()->getUnitOfWork()->isScheduledForInsert($activation));
                }
                $event->getEntityManager()->getUnitOfWork()->commit();//ENDLESS LOOP
                dump($event->getEntityManager()->getUnitOfWork()->getScheduledEntityUpdates());
                dump($event->getEntityManager()->getUnitOfWork()->getScheduledEntityInsertions());
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您尝试执行的操作在实体侦听器中是不允许的,preUpdate特别限制。

此外,这看起来像业务逻辑。我建议将逻辑移到Model / Handler。

您可以尝试添加custom action,而不必在EasyAdminBundle内部进行操作。