eil*_*rra 4 doctrine symfony doctrine-orm
我正试图检测onFlush事件中多对多关系的变化.
如果将新实体添加到关系中或更新关系(始终保持元素),我可以使用$unitOfWork->getScheduledCollectionUpdates()然后检查getInsertDiff()或检测更改getDeleteDiff().到现在为止还挺好.
当我从关系中取出所有实体时出现问题:"之前有两个相关实体,但现在没有相关实体."
当关系为空时我可以访问$unitOfWork->getScheduledCollectionDeletions(),但无法知道删除了哪些实体:
getDeleteDiff() 这个系列没有任何说明.getSnapshot() 并没有告诉我之前有哪些实体我怎么知道哪些实体被从多对多关系中取出?
我添加了一个完整实现的Gist:一切正常(可能需要一些优化),除了$uow->getScheduledCollectionDeletions()(第101行)
造成这个问题的原因有两个:
1)当clear()在a上调用该方法时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)创建一个fork symfony/symfony并实现一个选项,以便不添加MergeDoctrineCollectionListener.也许是no_clear为了防止添加监听器.这不会引入BC中断并且会解决您的问题,因为在删除所有实体clear()时不会调用集合的方法.
2)重新设计您的计数器:也许还可以监听OnLoad事件,该事件可以计算从数据库中提取时集合中实体的数量.这样,您的OnFlush侦听器就可以使用该数字来了解清除时从集合中删除的实体数量.
| 归档时间: |
|
| 查看次数: |
3583 次 |
| 最近记录: |