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