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

