【问题标题】:Yii 2 getOldAttribute() method not working in afterSaveYii 2 getOldAttribute() 方法在 afterSave 中不起作用
【发布时间】:2018-08-02 04:24:47
【问题描述】:

我有一个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`

    }

}

【问题讨论】:

  • 你的代码的一些快照会有帮助..!
  • 我添加了代码示例@Gru
  • 临时解决方案:创建一个原始用户并使用它@@

标签: activerecord yii2


【解决方案1】:

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

如果您想获取 email 字段的旧值(如果已更改),您的代码应如下所示

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

【讨论】:

  • 谢谢,但我的模型中不包含 afterSave 方法,我在 Service 层处理所有事情,你能看看上面的代码示例
  • 你需要添加它@dangchithao
  • 有另一种方式@Muhammad Omer Aslam
【解决方案2】:

当您保存新属性时,它不再是“旧的”。 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`

}

【讨论】:

  • 是的,我的临时解决方案:创建一个原始用户并使用它,我克隆它,感谢您的解释;)@rob006
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多