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

Dav*_*idW 14 doctrine-orm

文件说:

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

但它也说:

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

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

Dav*_*idW 34

显然,您需要自行重新计算变更集才能使更改生效:

$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
$meta = $em->getClassMetadata(get_class($entity));
$uow->recomputeSingleEntityChangeSet($meta, $entity);
Run Code Online (Sandbox Code Playgroud)

  • 即使设置了@cascade注释,这似乎也不适用于相关实体. (6认同)

小智 5

或者,您可以使用PreUpdateEventArgs类(http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.Event.PreUpdateEventArgs.html).例如:

public function preUpdate(PreUpdateEventArgs $args)
{
    $entity = $args->getEntity();

    if ($entity instanceof Product)
    {
        $args->setNewValue(
            "discount",
             123
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此方法的一个问题是,如果要对以前未更改的字段执行setNewValue.由于该字段尚未包含在变更集中,因此会引发错误.DavidW的回答绕过了这个限制. (12认同)