我在Doctrine2中有一个实体,并将HasLivecycleCallbacks与PrePersist一起使用。通常,这可以正常工作,但是当我实体中的某些字段更改时,我只想更改版本。我有机会获得旧的值(value)观吗?还是只是已更改的键?

/**
 * @ORM\HasLifecycleCallbacks
 */
class Person {


    /**
     * @PrePersist
     * @PreUpdate
     */
    public function increaseVersion() {


            if ( $this->version == null ) {
                $this->version = 0;
            }
            // only do this, when a certain attribute changed
            $this->version++;
    }
}

最佳答案

这取决于我们在谈论哪个LifecycleEvent。 PrePersist and PreUpdate are different events.

预更新在对实体进行更新之前会触发。这将为您提供一个 PreUpdateEventArgs 对象,它是扩展的LifecycleEventArgs对象。这将允许您查询更改的字段,并允许您访问旧值和新值:

if ($event->hasChangedField('foo')) {
    $oldValue = $event->getOldValue('foo');
    $newValue = $event->getNewValue('foo');
}

您还可以通过getEntityChangeSet()获得所有更改的字段值,这将为您提供如下数组:
array(
    'foo' => array(
        0 => 'oldValue',
        1 => 'newValue'
    ),
    // more changed fields (if any) …
)

PrePersist 假定使用新的实体(请考虑插入新行)。在PrePersist中,您将获得 LifecycleEventArgs 对象,该对象只能访问Entity和 EntityManager 。从理论上讲,您可以通过UnitOfWork来访问 EntityManager (跟踪实体的所有更改),因此您可以尝试执行
$changeSet = $event->getEntityManager()->getUnitOfWork()->getEntityChangeSet(
    $event->getEntity()
);

获取要保留的实体的更改。然后,您可以检查此数组以查找更改的字段。但是,由于我们在谈论插入而不是更新,因此我假设所有字段都将被视为“已更改”,并且旧值可能全部为null。我不确定,这是否会按您需要的方式工作。

进一步引用:http://docs.doctrine-project.org/en/2.0.x/reference/events.html

关于php - 如何在Doctrine2中的PrePersist LifecycleCallback上访问旧值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18762695/

10-11 00:53