gpt4 book ai didi

symfony - 在 Doctrine 2(和 Symfony)中正确使用 $unitOfWork->getScheduledCollectionDeletions() 是什么?

转载 作者:行者123 更新时间:2023-12-05 00:31:11 26 4
gpt4 key购买 nike

我正在尝试检测 onFlush 中多对多关系的变化事件。

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

当我从关系中取出所有实体时,问题就来了:“以前有两个相关实体,但现在有 没有 相关实体。”

当关系为空时,我可以访问 $unitOfWork->getScheduledCollectionDeletions() ,但无法知道删除了哪些实体:

  • getDeleteDiff()对于这个集合并没有说明什么。
  • getSnapshot()没有告诉我之前有哪些实体

  • 我怎么知道从多对多关系中取出了哪些实体?

    我添加了一个完整实现的 Gist:除了 $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 组件时,特别是 ChoiceTypeCollectionType类型与选项结合使用 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监听器可以使用该数字来了解在清除集合时从集合中删除了多少实体。

    关于symfony - 在 Doctrine 2(和 Symfony)中正确使用 $unitOfWork->getScheduledCollectionDeletions() 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15311083/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com