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

Laravel多ID关联表数量求和更新报错求助

问题分析与解决方案

原代码核心问题

  1. 多ID匹配错误:Servis_tareas::where('servis_id',$id_servis)未使用whereIn,无法正确匹配多个servis_id
  2. 数组操作错误:直接用+对数组执行加法是键合并操作,不是元素对应相加,无法得到每个ID的数量总和
  3. 批量更新逻辑错误:多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:15:42