Laravel多ID关联表数量求和更新报错求助
问题分析与解决方案
原代码核心问题
- 多ID匹配错误:
Servis_tareas::where('servis_id',$id_servis)未使用whereIn,无法正确匹配多个servis_id - 数组操作错误:直接用
+对数组执行加法是键合并操作,不是元素对应相加,无法得到每个ID的数量总和 - 批量更新逻辑错误:多个ID对应的总和各不相同,无法用统一的
update语句批量赋值;is_numeric($total) < 0的判断逻辑完全错误(数组无法用is_numeric验证,布尔值与0的比较也不符合需求)
解决方案1:循环处理单个ID(直观易维护,适合小数据量)
逐个处理目标ID,逻辑清晰便于调试:
$id_servis = [1077, 1078]; foreach ($id_servis as $id) { // 查找目标Servis记录,不存在则跳过 $servis = Servis::find($id); if (!$servis) continue; // 计算关联Servis_tareas的数量总和(若一个Servis对应多个tareas,必须用sum) $tareasTotal = Servis_tareas::where('servis_id', $id)->sum('quantity'); // 计算最终值:总和小于0则设为0 $finalQuantity = $servis->quantity_final + $tareasTotal; $finalQuantity = $finalQuantity < 0 ? 0 : $finalQuantity; // 更新当前记录 $servis->update(['quantity_final' => $finalQuantity]); }
解决方案2:数据库层面批量更新(高效,适合大数据量)
利用SQL关联查询直接计算并更新,减少PHP与数据库的交互次数:
$id_servis = [1077, 1078]; // 处理有对应Servis_tareas记录的ID,直接计算总和并更新 DB::table('servis') ->join( DB::raw('(SELECT servis_id, SUM(quantity) as tareas_sum FROM servis_tareas WHERE servis_id IN (' . implode(',', $id_servis) . ') GROUP BY servis_id) as tareas'), fn($join) => $join->on('servis.id', '=', 'tareas.servis_id') ) ->whereIn('servis.id', $id_servis) ->update([ 'quantity_final' => DB::raw('GREATEST(servis.quantity_final + tareas.tareas_sum, 0)') ]); // 处理无对应Servis_tareas记录的ID(确保这些记录的quantity_final不小于0) DB::table('servis') ->whereIn('id', $id_servis) ->whereNotExists(fn($query) => $query->select(DB::raw(1))->from('servis_tareas')->whereColumn('servis_tareas.servis_id', 'servis.id')) ->update([ 'quantity_final' => DB::raw('GREATEST(quantity_final, 0)') ]);
内容的提问来源于stack exchange,提问作者JL DIAZ
相关产品推荐
相关产品推荐

