Yii 2 getOldAttribute()方法在afterSave中不起作用

时间:2018-08-02 04:24:48

标签: activerecord yii2

我有一个model,我想保存后使用该模型字段的旧值,我使用的是getOldAttribute()方法,它总是返回最新值?

代码示例

class User extends ActiveRecord
{
    public function fields()
    {
       return [
          'id',
          'name',
          'email' //old value: example@example.com
       ];
    }
}

class UserService extends BaseService
{
    /**
     * Current user have email is `test@test.com`
     */
    public function update(User $user)
    {
       //before save
       $oldEmailBeforSave = $user->getOldAttribute('email'); //work fine and value is `example@example.com` 

       //handle update user
       $this->saveEntity($user)

       //after save
       $oldEmailAfterSave = $user->getOldAttribute('email'); //not work and value is `test@test.com`

    }

}

2 个答案:

答案 0 :(得分:1)

保存新属性时,该属性不再“旧”。 getOldAttribute()表示数据库中的状态,并允许您比较属性在find()save()之间是否以及如何更改。调用save()后,将刷新旧属性,因此getOldAttribute()将返回与getAttribute()相同的结果。

如果要访问对象的旧状态,则需要对其进行克隆并在克隆上使用这些方法-$cloned将代表对象的状态,然后再调用save()

public function update(User $user)
{
   //before save
   $oldEmailBeforSave = $user->getOldAttribute('email'); // `example@example.com` 
   $cloned = clone $user;

   //handle update user
   $this->saveEntity($user)

   //after save
   $oldEmailAfterSave = $user->getOldAttribute('email'); // `test@test.com`
   $oldEmailAfterSave = $cloned->getOldAttribute('email'); // `example@example.com`

}

答案 1 :(得分:0)

根据文档,您可以使用afterSave( $insert, $changedAttributes)的第二个参数,该参数包含已更改和保存的属性的旧值。

如果您想更改email字段的旧值,则您的代码应如下所示

public function afterSave( $insert, $changedAttributes ){
    parent::afterSave();
    if(!$insert){
        $oldEmail = $changedAttributes['email'];
        //do something here with the old email value
    }
}