在 Doctrine ODM PreUpdate 事件中更改另一个文档
Altering another document in Doctrine ODM PreUpdate event
MongoDB 和 Doctrine 都相当新。我目前正在为我的框架设置一个模型系统,并尝试实现这些事件。
想法是这样的:当某个模型更新时,新用户(也是模型)应该是 created/updated。我在 PreUpdate 事件中执行所有这些操作,以便我可以捕获所做的更改(检查模型上的电子邮件地址是否已更改)。
在此事件中创建并保留新模型非常有效,但是当我尝试更新用户时,我无法保存数据。我尝试刷新,但这会导致无限循环(我能理解为什么,因为他试图再次刷新同一个文档)。
关于我应该如何完成这项工作有什么想法吗?在用户的工作单元上尝试了 recomputeSingleDocumentChangeSet,但这似乎没有节省任何东西。
Tried recomputeSingleDocumentChangeSet on the unit of work for the user, but this doesn't seem to save anything.
这正是您应该做的(修改用户字段后)
$user->setSomething(true);
$uow->recomputeSingleDocumentChangeSet(/* ... */);
仅此而已,尤其是不要使用 flush
,因为您已经在 flush
中了。 recomputeSingleDocumentChangeSet
使 Doctrine 重新计算更改,稍后将包含在文档的更新查询中。
Creating and persisting a new model in this event works like a charm
然而,这听起来很奇怪,因为在 preUpdate
事件发生时持续存在的新对象不应作为插入到达数据库(除非您发布了另一个 flush
,此时可能会产生不需要的副作用)在更新之前处理。
您可以通过在更改相应字段值后重新计算 UnitOfWork-Changeset 来解决此问题。
如果不重新计算此 ChangeSet,则只会考虑已计划更新的字段。通过 $entity->setField() 进行的任何其他更改都将被忽略,而尝试直接使用 $eventArgs->setNewValue($field, $value) 将导致错误,因为后者仅接受对已经属于的值的修改当前 UnitOfWork - 更改集。
您可以通过以下方式触发此操作:
/** @var ObjectManager $em */
$om = $args->getObjectManager();
$om->getUnitOfWork()->recomputeSingleDocumentChangeSet($om->getClassMetadata($entity::class), $entity);
MongoDB 和 Doctrine 都相当新。我目前正在为我的框架设置一个模型系统,并尝试实现这些事件。
想法是这样的:当某个模型更新时,新用户(也是模型)应该是 created/updated。我在 PreUpdate 事件中执行所有这些操作,以便我可以捕获所做的更改(检查模型上的电子邮件地址是否已更改)。
在此事件中创建并保留新模型非常有效,但是当我尝试更新用户时,我无法保存数据。我尝试刷新,但这会导致无限循环(我能理解为什么,因为他试图再次刷新同一个文档)。
关于我应该如何完成这项工作有什么想法吗?在用户的工作单元上尝试了 recomputeSingleDocumentChangeSet,但这似乎没有节省任何东西。
Tried recomputeSingleDocumentChangeSet on the unit of work for the user, but this doesn't seem to save anything.
这正是您应该做的(修改用户字段后)
$user->setSomething(true);
$uow->recomputeSingleDocumentChangeSet(/* ... */);
仅此而已,尤其是不要使用 flush
,因为您已经在 flush
中了。 recomputeSingleDocumentChangeSet
使 Doctrine 重新计算更改,稍后将包含在文档的更新查询中。
Creating and persisting a new model in this event works like a charm
然而,这听起来很奇怪,因为在 preUpdate
事件发生时持续存在的新对象不应作为插入到达数据库(除非您发布了另一个 flush
,此时可能会产生不需要的副作用)在更新之前处理。
您可以通过在更改相应字段值后重新计算 UnitOfWork-Changeset 来解决此问题。
如果不重新计算此 ChangeSet,则只会考虑已计划更新的字段。通过 $entity->setField() 进行的任何其他更改都将被忽略,而尝试直接使用 $eventArgs->setNewValue($field, $value) 将导致错误,因为后者仅接受对已经属于的值的修改当前 UnitOfWork - 更改集。
您可以通过以下方式触发此操作:
/** @var ObjectManager $em */
$om = $args->getObjectManager();
$om->getUnitOfWork()->recomputeSingleDocumentChangeSet($om->getClassMetadata($entity::class), $entity);