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

Laravel中统计各客户支付总额及关联模型、全字段获取问题

解决方案

场景1:按客户分组,显示总支付额+客户信息+该客户所有支付记录

如果你需要每个客户一行数据,包含总支付额、客户详情,同时能获取该客户的所有支付记录字段,可以这样写:

$customerPayments = Payment::select('customer_id', DB::raw('sum(paid_amount) as total_paid'))
    ->groupBy('customer_id')
    ->with(['customer', 'customer.payments']) // 预加载客户模型和该客户的所有支付记录
    ->orderBy('customer_id', 'DESC')
    ->paginate(10);

使用时,你可以通过$item->total_paid拿到客户总支付额,$item->customer获取客户信息,$item->customer->payments遍历该客户的所有支付记录(包含payments表全数字段)。

场景2:每条支付记录显示全字段,同时附带所属客户的总支付额

如果需要保留每条支付记录的全字段,同时显示该客户的累计支付总额,无需分组,改用子查询实现:

$payments = Payment::with(['customer'])
    ->select('*', DB::raw('(SELECT sum(paid_amount) FROM payments WHERE customer_id = payments.customer_id) as total_paid'))
    ->orderBy('customer_id', 'DESC')
    ->paginate(10);

这样每条$payment对象既包含payments表的所有字段,又有total_paid字段存储对应客户的总支付额,同时关联了Customer模型。

你之前代码的问题说明

  • 第一段代码缺少groupBy('customer_id'),导致sum(paid_amount)计算的是所有支付记录的总和,而非按客户分组统计。
  • 第二段代码虽然加了分组,但仅选择了customer_id和聚合后的支付额,没有包含payments表的其他字段;另外要关联Customer模型,必须加上with(['customer'])。需要注意:SQL严格模式下,SELECT中的非聚合字段必须出现在GROUP BY中,所以直接在分组查询里选payments所有字段会报错(除非关闭严格模式,但不推荐)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:33:32