我注意到当我使用雄辩的
update()
方法时它也会更新脏列:
$user = User::find(1);
$user->is_admin = 1;
$user->update(['first_name' => 'Alex']);
//is_admin updated to 1 !
不是应该只更新
first_name
栏吗?
什么雄辩的方法只更新给定的字段并忽略脏列?
请注意,我知道
refresh
和 fresh
方法会添加额外的查询,这不是我寻找的方法。
要将模型属性重置为原始属性(从第一个查询或最后一次刷新/刷新),请使用
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');
$user = User::find(1);
$user->is_admin = 1;
$user->update(array_merge($user->getOriginal(), ['first_name' => 'Alex']));
这应该只会更新 first_name
但也可能会恢复脏属性