Laravel一对多关系下如何获取关联表全局总和而非单条总和
解决方案
方法一:直接查询支付表求和
如果不需要关联发票的其他数据,直接查询Payments表是最高效的方式:
$totalAmount = Payment::sum('amount');
如果需要结合你的$date筛选条件,补充where语句即可:
$totalAmount = Payment::where('paid_date', $date)->sum('amount');
方法二:基于现有发票查询结果汇总
如果已经获取了发票集合,可通过集合方法从关联的支付数据里汇总总金额:
$invoices = Invoice::select('id', 'status', 'service_inv_cat_id') ->with(['payment' => function ($q) use ($date){ $q->select('id','invoice_id','type', 'method', 'amount', 'responsible_worker', 'paid_date'); }]) ->orderBy('status', 'ASC') ->get(); // 扁平化所有支付记录后求和 $totalAmount = $invoices->pluck('payment')->flatten()->sum('amount');
方法三:在发票查询中嵌入全局总和子查询
如果想在查询发票的同时获取全局支付总金额,可通过子查询实现:
$invoices = Invoice::select('id', 'status', 'service_inv_cat_id') ->with(['payment' => function ($q) use ($date){ $q->select('id','invoice_id','type', 'method', 'amount', 'responsible_worker', 'paid_date'); }]) ->orderBy('status', 'ASC') ->addSelect([ 'global_total_payments' => Payment::selectRaw('SUM(amount)') // 可选:仅统计当前查询范围内发票的支付记录 ->whereIn('invoice_id', Invoice::select('id')) // 加入你的日期筛选条件 ->where('paid_date', $date) ]) ->get(); // 所有发票的global_total_payments值一致,取任意一个即可 $totalAmount = $invoices->first()?->global_total_payments ?? 0;
注意:所有方法中如果需要筛选特定日期的支付记录,记得统一带上$date相关的where条件,保证数据一致性。
内容的提问来源于stack exchange,提问作者Shady Hesham
相关产品推荐
相关产品推荐

