什么是正确使用$ unitOfWork-> getScheduledCollectionDel

2019-08-17 10:44发布

我试图检测在一个多一对多关系变化onFlush事件。

如果新的实体将被添加到关系或关系被更新(总是保持一个元素),我可以使用检测更改$unitOfWork->getScheduledCollectionUpdates()然后检查getInsertDiff()getDeleteDiff() 到现在为止还挺好。

问题是当我把所有的实体出来的关系:“有两个相关的实体之前,但现在有没有相关的实体。”

当关系为空我可以访问$unitOfWork->getScheduledCollectionDeletions()但没有办法知道哪些实体被删除的方法:

  • getDeleteDiff()这个集合并没有告诉任何东西。
  • getSnapshot()不告诉我哪些实体那里之前

我怎么知道采取哪些实体了许多一对多关系?


我添加了一个要点全面实施:一切工作正常(它可能需要一些优化),除了$uow->getScheduledCollectionDeletions()行101)

https://gist.github.com/eillarra/5127606

Answer 1:

这个问题的原因是双重的:

1)当该方法clear()上调用Doctrine\ORM\PersistentCollection ,它将:

  1. 清除实体的内部集合。
  2. 调用scheduleCollectionDeletion()Doctrine\ORM\UnitOfWork
  3. 拿自己的新快照。

2号是您的收藏中显示出来的原因$uow->getScheduledCollectionDeletions()而不是在$uow->getScheduledCollectionUpdates() 3号就是为什么你不能确定什么是集合在它被清除之前的原因。

2)当使用Symfony2的Form组件,特别是ChoiceTypeCollectionType类型与选项组合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)?