Eloquent `update()` 方法也会更新脏列

问题描述 投票:0回答:2

我注意到当我使用雄辩的

update()
方法时它也会更新脏列:

$user = User::find(1);

$user->is_admin = 1;

$user->update(['first_name' => 'Alex']);

//is_admin updated to 1   !

不是应该只更新

first_name
栏吗?

什么雄辩的方法只更新给定的字段并忽略脏列?

请注意,我知道

refresh
fresh
方法会添加额外的查询,这不是我寻找的方法。

php laravel
2个回答
4
投票

要将模型属性重置为原始属性(从第一个查询或最后一次刷新/刷新),请使用

syncOriginal()

在这种情况下,在更新后使用时它将不起作用,因为当您使用模型实例进行更新时,它也会更新脏属性is_admin

(检查您的数据库)。

文件定义所示,它仍然在模型上运行->save()

,并且也会将更改保存在
is_admin
上。

/** * Update the model in the database. * * @param array $attributes * @param array $options * @return bool */ public function update(array $attributes = [], array $options = []) { if (! $this->exists) { return false; } return $this->fill($attributes)->save($options); }
解决方案是忽略实例并进行新查询

$user = User::find(1); $user->is_admin = 1; User::whereKey($user->getKey())->update(['first_name' => 'Alex']); //you should also set it in the model $user->first_name = 'Alex'; $user->setOriginalAttribute('first_name', 'Alex');
    

1
投票
据我所知,没有内置方法可以在更新之前恢复值,但您可以自己制作:

$user = User::find(1); $user->is_admin = 1; $user->update(array_merge($user->getOriginal(), ['first_name' => 'Alex']));
这应该只会更新 

first_name

 但也可能会恢复脏属性

© www.soinside.com 2019 - 2024. All rights reserved.