Laravel 单次查询中关联另一表获取指定字段求和值的实现方案
解决方案
完整实现代码
public function spendPerCatalogNumber(Collection $orders, array $suppliers, array $costs): array { // 白名单过滤合法字段,避免SQL注入,可根据业务实际需要调整允许统计的成本字段 $allowedCostFields = ['fees', 'shipping_cost', 'sales_tax']; $validCosts = array_intersect($costs, $allowedCostFields); $select = [ 'ordered_items.supplier_sku', DB::raw('SUM(ordered_items.price) as cogs'), DB::raw('SUM(ordered_items.quantity) as qty'), DB::raw('(SUM(ordered_items.price::numeric) / SUM(ordered_items.quantity)) as avg') ]; // 动态生成成本字段求和语句 foreach ($validCosts as $field) { $select[] = DB::raw("SUM(orders.`{$field}`) as {$field}_total"); } $data = DB::table('ordered_items') ->join('orders', 'orders.id', '=', 'ordered_items.order_id') ->whereIn('ordered_items.order_id', $orders) ->whereIn('ordered_items.supplier', $suppliers) ->select($select) ->groupBy('ordered_items.supplier_sku') ->get(); return $data->toArray(); }
逻辑说明
- 保留了你原有按
supplier_sku分组统计商品成本、数量、均价的逻辑,同时新增了动态成本字段统计能力。 - 通过
join单次关联两张表完成所有统计,无需拆分多次查询,性能更优。 - 成本字段通过白名单过滤,完全避免客户端传入非法字段导致的SQL注入风险。
- 统计的成本字段别名统一为
字段名_total格式,方便前端统一读取处理。
如果需要按供应商维度分组统计,只需将groupBy参数修改为ordered_items.supplier,同时把select数组中的supplier_sku替换为ordered_items.supplier即可,和你提供的原生SQL逻辑完全对齐。
内容的提问来源于stack exchange,提问作者Riza Khan
相关产品推荐
相关产品推荐

