如何更改preUpdate事件侦听器中的字段值?

时间:2012-01-19 16:57:43

标签: doctrine-orm

文档说:

  

刷新操作不再识别对传递实体的字段的更改,使用传递给事件的计算更改集来修改基本字段值。

但它也说:

  

getEntityChangeSet()获取变更集数组的副本。对此返回数组的更改不会影响更新。

这是否意味着我无法在preUpdate事件监听器中更改实体的字段?如果没有,我将如何完成此更新?

2 个答案:

答案 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
        );
    }
}