在 onFlush 侦听器中重新计算实体变更集

tam*_*mir 5 event-listener changeset doctrine-orm

考虑以下模式:

[Work]
id
tags ManyToMany(targetEntity="Tag", inversedBy="works", cascade={"persist"})

[Tag]
id
works_count
works ManyToMany(targetEntity="Work", mappedBy="tags")
Run Code Online (Sandbox Code Playgroud)

works_count是 的计数器缓存Tag::works

onFlushWork上有一个侦听器,用于检查是否Work::tags已更改,并更新每个标签的works_count.

public function onFlush(OnFlushEventArgs $args)
{
    foreach ($uow->getScheduledEntityUpdates() as $work) {
        $changedTags = /* update relevant tags and return all the changed ones */

        $metadata = $em->getClassMetadata('Acme\Entity\Tag');

        foreach ($changedTags as $tag) {
            $uow->recomputeSingleEntityChangeSet($metadata, $tag);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我阅读更新标签的变更集, 的更改会works_count正确显示,它们不会在数据库中更新..

如果我替换为recomputeSingleEntityChangeSet()computeChangeSet()那么一切都按预期工作并且数据库已更新,但是computeChangeSet() 上有一个@internal Don't call from the outside.注释,所以我不确定后果是什么..

互联网上的每个来源都说要使用,recomputeSingleEntityChangeSet那么为什么在这种情况下不起作用呢?

PS 标签由EntityManager管理($em->contains($tag)返回true)

edi*_*igu 4

这个问题与 UnitOfWork 中的一个 bug 有关,最终在 2014 年 9 月 11 日发布的Doctrine ORM 2.4.3中得到了修复。有关详细信息,请参阅DDC-2996 。