我有一个DocumentA的活动订阅者。 DocumentA具有DocumentB类型的关联文档。在DocumentA的preUpdate生命周期事件挂钩期间,我想在其DocumentB上刷新一个值。我有这样的代码:
public function preUpdate(LifecycleEventArgs $args)
{
$document = $args->getDocument();
if (!($document instanceof DocumentA) ||
return;
}
if ($documentsB = $document->getDocumentB()) {
$dm = $args->getDocumentManager();
foreach (iterator_to_array($documentsB) as $docB) {
$documentB = $dm->find(DocumentB::class, $docB->getId());
$documentB->setFooCode();
$dm->merge($documentB);
}
}
}
我已使用$dm->persist($documentB)
而非使用merge()
尝试此操作,我已将DocumentA与DocumentB的关系设置为cascade: {all}
,而我&#39 ;我已经为DocumentA和每个DocumentB尝试了$dm->getUnitOfWork()->recomputeSingleDocumentChangeSet($class, $document);
,但我似乎无处可去。即使对于单个DocumentB,我也似乎无法调用flush()
而不会导致段错误(我假设它在preUpdate事件中触发了无限循环的preUpdate事件?)
如果在DocumentA的事件订阅者的preUpdate方法中进行更改,如何保存对关联文档的更改?
答案 0 :(得分:1)
我在之前的一个问题中对此进行了详细阐述,但是要从Doctrine's documentation重申:
- 此事件中绝不允许更新已更新实体的关联 - 不再能够通过刷新操作识别传递实体的关联。
考虑到你在侦听器中试图处理的复杂程度,我认为你最好还是制作一个处理其中一些内容的服务,然后再调用它。