有两个实体:
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
因此结果显示*******的行导致了这个不定式循环。我在交易中。我知道它不多,但是我可以帮助我吗?
答案 0 :(得分:1)
你不应该使用remove->在PreUpdate中,这可能是您遇到问题的原因。
请参阅documentation on PreUpdate,请注意底部“此事件的限制”部分。
您应该考虑使用onFlush或prePersist等其他事件。在你的情况下,我会把它写成event listener,而不是实体方法,因为你可以访问工作单元和其他有用的东西。