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
相关产品推荐
相关产品推荐

