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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:36:03