【问题标题】:Save update of one Doctrine document from preUpdate hook of another document?从另一个文档的 preUpdate 挂钩保存一个 Doctrine 文档的更新?
【发布时间】:2014-12-31 21:53:14
【问题描述】:

我有一个 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},并且我已为 DocumentA 和每个 DocumentB 尝试了 $dm->getUnitOfWork()->recomputeSingleDocumentChangeSet($class, $document);,但我没有似乎无处可去。即使是单个 DocumentB,我似乎也无法调用 flush() 而不会导致段错误(我假设它会触发 preUpdate 事件中的 preUpdate 事件的无限循环?)

在 DocumentA 的事件订阅者的 preUpdate 方法中进行更改时,如何保存对关联文档的更改?

【问题讨论】:

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


    【解决方案1】:

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

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

    鉴于您尝试在侦听器中处理的复杂程度,我认为您最好创建一个服务来处理其中的一些并调用它。

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 2017-06-13
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多