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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:54:20