You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eloquent的update()会更新脏列?如何仅更新指定字段忽略脏列?

脏列同步更新的原因

Laravel Eloquent 的 update() 方法设计逻辑就是先将传入的参数合并到模型当前的属性数组中,再统一提交所有脏属性(即和原始存储值不一致的属性)做更新,并非仅更新传入的字段列表,属于框架的既定行为。

仅更新指定字段、忽略脏列的实现方案

以下方案均不会产生额外查询,也不会同步已存在的脏列:

  • 方案1:调用 save() 时指定要保存的字段
    直接在 save() 方法中传入仅需更新的字段列表,模型上其他脏属性会被自动忽略:
    $user = User::find(1);
    $user->is_admin = 1;
    $user->first_name = 'Alex';
    // 仅更新first_name字段
    $user->save(['only' => ['first_name']]);
    
  • 方案2:使用内置 updateOnly() 方法(Laravel 10+ 支持)
    高版本Laravel已内置该方法,专门用于仅更新传入的指定字段,完全忽略模型已有的脏属性:
    $user = User::find(1);
    $user->is_admin = 1;
    // 仅更新传入的first_name,is_admin的脏值不会被同步到数据库
    $user->updateOnly(['first_name' => 'Alex']);
    
  • 方案3:低版本Laravel兼容实现
    10以下版本没有内置updateOnly的场景下,可以手动实现等效逻辑:
    $user = User::find(1);
    $user->is_admin = 1;
    $updateData = ['first_name' => 'Alex'];
    $user->fill($updateData)->save(array_keys($updateData));
    

内容的提问来源于stack exchange,提问作者Mwthreex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:48:03