从另一个文档的preUpdate挂钩保存一个Doctrine文档的更新?

时间:2014-12-31 21:53:15

标签: mongodb symfony doctrine-orm lifecycle doctrine-odm

我有一个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方法中进行更改,如何保存对关联文档的更改?

1 个答案:

答案 0 :(得分:1)

我在之前的一个问题中对此进行了详细阐述,但是要从Doctrine's documentation重申:

  
      
  • 此事件中绝不允许更新已更新实体的关联    - 不再能够通过刷新操作识别传递实体的关联。
  •   

考虑到你在侦听器中试图处理的复杂程度,我认为你最好还是制作一个处理其中一些内容的服务,然后再调用它。