我试图检测在一个多一对多关系变化onFlush
事件。
如果新的实体将被添加到关系或关系被更新(总是保持一个元素),我可以使用检测更改$unitOfWork->getScheduledCollectionUpdates()
然后检查getInsertDiff()
或getDeleteDiff()
到现在为止还挺好。
问题是当我把所有的实体出来的关系:“有两个相关的实体之前,但现在有没有相关的实体。”
当关系为空我可以访问$unitOfWork->getScheduledCollectionDeletions()
但没有办法知道哪些实体被删除的方法:
-
getDeleteDiff()
这个集合并没有告诉任何东西。 -
getSnapshot()
不告诉我哪些实体那里之前
我怎么知道采取哪些实体了许多一对多关系?
我添加了一个要点全面实施:一切工作正常(它可能需要一些优化),除了$uow->getScheduledCollectionDeletions()
行101)
https://gist.github.com/eillarra/5127606
这个问题的原因是双重的:
1)当该方法clear()
上调用Doctrine\ORM\PersistentCollection
,它将:
- 清除实体的内部集合。
- 调用
scheduleCollectionDeletion()
的Doctrine\ORM\UnitOfWork
。 - 拿自己的新快照。
2号是您的收藏中显示出来的原因$uow->getScheduledCollectionDeletions()
而不是在$uow->getScheduledCollectionUpdates()
3号就是为什么你不能确定什么是集合在它被清除之前的原因。
2)当使用Symfony2的Form组件,特别是ChoiceType
或CollectionType
类型与选项组合multiple
,即clear()
当所有实体应当从集合中移除的方法将被调用。
这是由于MergeDoctrineCollectionListener
其在这里补充说: https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php#L55
这样做是为优化:它的速度更快这种方式来清除集合,在检查该实体应当从它删除代替。
我能想到的两种可能的解决方案 :
1)创建一个叉symfony/symfony
并以不添加实施的选项MergeDoctrineCollectionListener
。 也许像no_clear
防止监听器被添加。 这不会引入BC休息,将解决你的问题,因为clear()
时, 所有实体应删除收集的方法将不会被调用。
2)重新设计您的计数器:也许还听OnLoad
事件,可以在它的从数据库中取出的时间计算实体的集合中的量。 这样,你的OnFlush
监听器可以使用该号码就知道有多少机构在从集合中删除,当它被清除。
文章来源: What's the proper use of $unitOfWork->getScheduledCollectionDeletions() in Doctrine 2 (and Symfony)?