刷新实体会导致无限循环(Doctrine 2)

时间:2016-03-09 16:03:34

标签: php symfony doctrine-orm

有两个实体:

A: which will auto update something on B
B
在A中有一个preupdate:

@ORM\PreUpdate
public function asd()
{
    foreach (\Doctrine\Repository\B::getInstance()->findxxxx($sdf) as $x)
    {
        $em->remove($x);
        $em->flush(); *******
    }
}

我追踪了SQL日志:

Doctrine\Entity\Accommodation.php: 1116
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Event\ListenersInvoker.php: 102
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 1064
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 384
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php: 356
Doctrine\Entity\Accommodation.php: 1116
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Event\ListenersInvoker.php: 102
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 1064
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 384
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php: 356
Doctrine\Entity\Accommodation.php: 1116
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\Event\ListenersInvoker.php: 102
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 1064
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php: 384
Doctrine\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php: 356
Doctrine\Entity\Accommodation.php: 1116 

因此结果显示*******的行导致了这个不定式循环。我在交易中。我知道它不多,但是我可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

你不应该使用remove->在PreUpdate中,这可能是您遇到问题的原因。

请参阅documentation on PreUpdate,请注意底部“此事件的限制”部分。

您应该考虑使用onFlush或prePersist等其他事件。在你的情况下,我会把它写成event listener,而不是实体方法,因为你可以访问工作单元和其他有用的东西。