Php 如何在preUpdate中取消属性更新

Php 如何在preUpdate中取消属性更新,php,doctrine-orm,doctrine,Php,Doctrine Orm,Doctrine,我正在尝试取消条令侦听器的preUpdate方法中的属性更新 我现在做的是: /** * @param Subject $subject * @param PreUpdateEventArgs $args */ public function preUpdate(Subject $subject, PreUpdateEventArgs $args) { $em = $args->getEntityManager(); $uow = $em->getUnitOfW

我正在尝试取消条令侦听器的preUpdate方法中的属性更新

我现在做的是:

/**
 * @param Subject $subject
 * @param PreUpdateEventArgs $args
 */
public function preUpdate(Subject $subject, PreUpdateEventArgs $args)
{
    $em = $args->getEntityManager();
    $uow = $em->getUnitOfWork();
    $meta = $em->getClassMetadata(Subject::class);

    foreach (Subject::ENCRYPTED_FIELDS as $fieldName => $fieldType) {
        $setter = "set" . ucfirst($fieldName);
        $oldValueDecrypted = $this->cryptService->fromEncryptedString($args->getOldValue($fieldName), $fieldType);
        if ($oldValueDecrypted == $args->getNewValue($fieldName)) {
            $subject->$setter($args->getOldValue($fieldName));
            $uow->recomputeSingleEntityChangeSet($meta, $subject);
        }
    }

}
不幸的是,它并没有像它更新的字段那样工作。另一件事是,当我打电话的时候

$uow->getEntityChangeSet($subject);
更改属性后,旧值和新值将切换,因此新值将变为原始值,反之亦然。但它对数据库操作没有影响。 我在onFlush中尝试了同样的方法,结果也一样。

根据

您只需使用
$eventArgs->setNewValue($fieldName,$value)
更改要更新的字段的值。 就你而言:

$eventArgs->setNewValue($fieldName, $args->getOldValue($fieldName));

我已经试过了,但它不能解决问题。即使$uow->getEntityChangeSet()显示新旧值相同,更新仍会触发。