gpt4 book ai didi

symfony - 使用 Doctrine 的 PreUpdate 生命周期事件保留对文档所做的更改

转载 作者:行者123 更新时间:2023-12-02 15:14:08 26 4
gpt4 key购买 nike

我有一个事件订阅者,其中包含两个生命周期事件方法:prePersist 和 preUpdate。 prePersist 正在按预期工作 - 我修改文档,并且稍后在检索文档时会反射(reflect)更改。但 preUpdate 并未按预期工作。基本上是这样的:

/**
* Also update the foo code when the bar profile is updated.
* @param LifecycleEventArgs $args
*/
public function preUpdate(LifecycleEventArgs $args)
{
$document = $args->getDocument();
if ($document instanceof BarProfile) {
$document->setFooCode('Salamanders');
}
}

如果我创建一个文档并在 perPersist 函数中将其 fooCode 设置为“占位符”,那么当我稍后检索该文档时,它的 fooCode 为“占位符”。如果我随后更新它并再次检索它,那么我期望它的 fooCode 为“Salamanders”。然而,它仍然是“占位符”。我什至尝试将 error_log() 内容放入其中,并将内容写入日志,以便我可以看到该方法正在执行。

$document->setFooCode() 之后我是否需要执行第二步才能使 fooCode 的新值保留下来?

最佳答案

您不能直接在 preUpdate 事件中修改字段,您必须修改它们的原始值。不允许更改关联。你必须这样做:

$eventArgs->setNewValue('fooCode', 'Salamanders');

您表示“prePersist 正在按预期工作 - 我修改了文档,并且稍后在我检索文档时会反射(reflect)更改。”

这让我相信您可能没有意识到持久化和更新之间的区别。在 Doctrine 中,当您第一次创建对象时会发生持久化。当您对已由 Doctrine 管理的现有对象进行更改时,就会发生更新。很多人对此感到困惑,但当你更新现有实体时,不需要调用persist(),只需要调用flush()即可。例如:

// inserts a new entity into the database
$document = new Document();
$document->setName('My Document');

$em->persist($document);
$em->flush();

// retrieves entity from the database, makes a change, then updates the database
$document = $em->findOneByName('My Document');
$document->setFooCode('Salamanders');

$em->flush();

我鼓励您read the Doctrine documentation就像塞拉德建议的那样。密切注意 preUpdate 事件的以下语句:

  • PreUpdate is the most restrictive to use event
  • Changes to associations of the updated entity are never allowed in this event
  • Changes to fields of the passed entities are not recognized by the flush operation anymore, use the computed change-set passed to the event to modify primitive field values

关于symfony - 使用 Doctrine 的 PreUpdate 生命周期事件保留对文档所做的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27714773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com