2014-12-31 104 views
2

我有DocumentA的事件订户。 DocumentA具有关联的DocumentB类型的文档。在DocumentA的preUpdate生命周期事件挂钩期间,我想刷新其DocumentB上的值。我的代码如下所示:从另一个文档的preUpdate钩子保存一个Doctrine文档的更新?

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(),我给自己定文献展的关系DocumentB到cascade: {all},我尝试了$dm->getUnitOfWork()->recomputeSingleDocumentChangeSet($class, $document);两个文献展和各DocumentB,但我似乎没有得到任何地方。我似乎无法调用flush()即使对于单个DocumentB也不会导致段错误(我假设它会触发preUpdate事件内的preUpdate事件的无限循环?)

如何将更改保存到我的在DocumentA的事件订阅服务器的preUpdate方法中进行更改时,是否有关联的文档?

回答

1

我在以前的一个问题进一步阐述了这一点,但是从Doctrine's documentation重申:

  • 更改更新实体协会在此事件 -Changes从不允许的关联通过的实体不再被刷新操作识别。

随着复杂程度,你想在监听器来处理,我想你会过得更好使,处理一些这样的服务,并调用来代替。

相关问题