如何捕获已清除的PersistentCollection的更改?

时间:2017-02-06 15:27:30

标签: php mongodb symfony doctrine doctrine-odm

我目前正在编写一个非常抽象的订阅者,它应该捕获并处理任何给定文档的所有类型的更改。

尝试时我遇到了一个我不知道如何处理的边缘:

1)我的文档保留了一个embedMany子文档集合。 2)我打电话给$document->collection->clear() 3)然后我冲洗

如何捕获对集合属性的更改?

我的订阅者当前对doctrine的onFlush事件作出反应。到目前为止,我已经尝试过(一切都没有成功):

  • 迭代ScheduledDocumentInsertions
  • 迭代ScheduledDocumentUpserts
  • 迭代ScheduledDocumentUpdates
  • 迭代完整的IdentityMap()并为每个文档调用$unitOfWork->getScheduledCollections($document)并尝试在那里找到更改

在任何这种情况下,我似乎无法找到该文档或其集合。我强烈地感觉到,如果该学说计划在实际数据库提交期间清除所有内容,那么该学说应该保留对该集合的引用。

我很乐意感谢任何有用的解决方案的帮助或提示。

1 个答案:

答案 0 :(得分:0)

我收到了漂亮的extensive answer in the doctrine/mongo-odm github issue board

TL; DR:

  

但是,如果您在清除之前需要知道集合中存在的元素,那么您就不幸了。

总结:

如果集合尚未初始化(我必须假设我希望我的订阅者在所有情况下工作),整个集合将被删除,而不知道在此过程中将丢弃哪些元素。由于集合在被删除之前不会被初始化 - 这样做是为了保持性能并减少内存占用。

对于嵌入式文档的收集,最可行的方法似乎是use a custom collection class。然后,该类可以以预期的方式处理明确的情况。