文档说:
刷新操作不再识别对传递实体的字段的更改,使用传递给事件的计算更改集来修改基本字段值。
但它也说:
getEntityChangeSet()获取变更集数组的副本。对此返回数组的更改不会影响更新。
这是否意味着我无法在preUpdate事件监听器中更改实体的字段?如果没有,我将如何完成此更新?
答案 0 :(得分:34)
显然,您需要自行重新计算变更集才能使更改生效:
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
$meta = $em->getClassMetadata(get_class($entity));
$uow->recomputeSingleEntityChangeSet($meta, $entity);
答案 1 :(得分:5)
或者,您可以使用PreUpdateEventArgs类(http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.Event.PreUpdateEventArgs.html)。 Forexample:
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Product)
{
$args->setNewValue(
"discount",
123
);
}
}