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

Laravel使用Eloquent实现批量更新多条数据减少数据库请求的方法

实现方案

你需要通过CASE WHEN语法构造单次更新请求,总共仅需要2次数据库交互即可完成需求,实现代码如下:

第一步:查询获取目标记录ID(1次查询请求)

先按原有条件查询要更新的4条孩子记录,按顺序获取ID数组:

// 按原有条件查询,按顺序获取目标孩子的ID数组
$childIds = children::where(['father_id' => 5, 'isGoodBoy' => true])
    ->take(4)
    ->pluck('id');
// 对应要赋值的新father_id数组,顺序需要和上面的$childIds一一对应
$newFatherIds = [7, 8, 50, 55];

第二步:构造批量更新语句执行(1次更新请求)

通过原生SQL的CASE WHEN实现单条SQL批量更新不同记录的不同字段值:

// 构造CASE WHEN逻辑
$caseStatements = collect($childIds)->map(function ($childId, $index) use ($newFatherIds) {
    return "WHEN id = {$childId} THEN {$newFatherIds[$index]}";
})->implode(' ');

// 执行更新,仅触发1次数据库请求
children::whereIn('id', $childIds)
    ->update([
        'father_id' => \DB::raw("CASE {$caseStatements} END")
    ]);

补充说明

  • 如果你的所有记录要更新为同一个值,不需要分不同赋值,直接使用更简单的批量更新语法即可:
    children::whereIn('id', $childIds)->update(['father_id' => 目标值]);
    
  • 该方案总共仅产生2次数据库请求,完全符合性能要求,避免了循环save产生的N次更新请求。

内容的提问来源于stack exchange,提问作者Mahdi gh hastam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:45:01