考虑以下架构:
[Work]
id
tags ManyToMany(targetEntity="Tag", inversedBy="works", cascade={"persist"})
[Tag]
id
works_count
works ManyToMany(targetEntity="Work", mappedBy="tags")
works_count
是一个计数器缓存Tag::works
。
我在WorkonFlush
上有一个监听器,它检查是否已更改,并更新每个标签的.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);
}
}
}
现在,如果我阅读更新标签的变更集,更改会works_count
正确显示,但它们不会在数据库中更新..
如果我替换recomputeSingleEntityChangeSet()
为,computeChangeSet()
那么一切都按预期工作并且数据库被更新,但是computeChangeSet()上面有一个@internal Don't call from the outside.
注释,所以我不确定后果是什么..
互联网上的每个来源都说要使用recomputeSingleEntityChangeSet
,那么为什么在这种情况下它不起作用?
PS
标签由 EntityManager 管理($em->contains($tag)
返回 true)