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
相关产品推荐
相关产品推荐

