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

Laravel9按发票ID分组汇总关联coletes子表totaleuro总和的方法

问题原因

现有查询未指定分组规则,SUM()聚合函数在无GROUP BY声明时,会默认对所有符合关联条件的记录做全局统计,因此仅返回全部coletes记录的总合计1700,无法按单张发票维度拆分计算汇总值。

修正方案

根据你的页面展示需求(同时展示发票下coletes明细+单张发票合计),推荐两种实现方式:

方式1:仅获取单张发票维度的汇总值

如果只需要每张发票的合计金额,直接加分组规则即可:

$invoiceSums = DB::table('coletes')
    ->join('invoices', 'coletes.invoice_id', '=', 'invoices.id')
    ->select(
        'invoices.id as invoice_id',
        DB::raw('SUM(coletes.totaleuro) as invoice_total')
    )
    ->groupBy('invoices.id') // 核心:按发票ID分组统计
    ->get();

执行后返回结果集包含两个元素:发票ID=1对应合计700,发票ID=2对应合计1000,符合分组汇总预期。

方式2:获取明细+分组汇总(匹配目标页面渲染逻辑)

如果需要同时拿到coletes明细和对应发票的合计,直接渲染你给出的表格效果,不建议在SQL层做明细与合计的混排,用Laravel集合的分组处理逻辑更易维护:

// 第一步:查询所有关联的明细数据
$detailList = DB::table('coletes')
    ->join('invoices', 'coletes.invoice_id', '=', 'invoices.id')
    ->select(
        'invoices.id as invoice_id',
        'coletes.id as colete_id',
        'coletes.totaleuro as colete_euro'
    )
    ->orderBy('invoices.id')
    ->get();

// 第二步:按发票ID分组,同时计算单张发票下的合计值
$renderData = $detailList->groupBy('invoice_id')->map(function ($coleteItems, $invoiceId) {
    return [
        'invoice_id' => $invoiceId,
        'colete_items' => $coleteItems,
        'invoice_total' => $coleteItems->sum('colete_euro')
    ];
});

视图层遍历$renderData即可实现目标展示效果:遍历单个发票分组时,第一条明细正常显示invoiceID,同组后续明细的invoiceID位置留空,单组明细遍历完成后输出该组的Total合计值即可。

注意:如果你的Laravel配置中开启了MySQL严格模式(config/database.php中mysql项strict为true),groupBy的字段必须与select中非聚合字段保持一致,上述写法符合SQL规范,不会抛出语法错误。

内容的提问来源于stack exchange,提问作者Catalin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:21:14