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

Laravel 5.8中如何结合groupBy合并两个查询结果?

解决Laravel两个分组查询结果的合并问题

你用merge()方法得到错误结果的原因是:这个方法只是简单将两个集合的元素拼接在一起,不会对相同package_name的行进行统计数据的合并,最终会出现重复的package_name条目,且统计值没有累加。

下面提供两种可行的解决方案:

方案一:数据库层面合并(推荐,效率更高)

通过unionAll合并两个子查询的结果,再重新分组聚合统计数据,适合数据量较大的场景:

// 构造第一个查询,统一字段别名
$invoiceSubQuery = Invoice::select(
    'package_name',
    DB::raw('count(*) as item_count'),
    DB::raw('sum(payable_amount) as sum_amount')
)->whereBetween(DB::raw('DATE(payment_date)'), [$from, $to])
->groupBy('package_name');

// 构造第二个查询,使用和第一个一致的字段别名
$agentInvoiceSubQuery = AgentInvoice::select(
    'package_name',
    DB::raw('count(*) as item_count'),
    DB::raw('sum(payable_amount) as sum_amount')
)->whereBetween(DB::raw('DATE(payment_date)'), [$from, $to])
->groupBy('package_name');

// 合并两个子查询,再进行最终的分组统计
$mergedResult = DB::table(DB::raw("({$invoiceSubQuery->unionAll($agentInvoiceSubQuery)->toSql()}) as combined_data"))
    // 绑定两个子查询的参数,避免SQL注入
    ->mergeBindings($invoiceSubQuery)
    ->mergeBindings($agentInvoiceSubQuery)
    ->select(
        'package_name',
        DB::raw('sum(item_count) as total'),
        DB::raw('sum(sum_amount) as totalamount')
    )
    ->groupBy('package_name')
    ->get();

方案二:集合层面合并(灵活,适合小数据量)

如果数据量不大,可以在内存中通过集合操作合并相同package_name的统计数据:

// 将两个集合转换为以package_name为键的关联数组
$pgData = $search_resultpg->keyBy('package_name')->toArray();
$pgaData = $search_resultpga->keyBy('package_name')->toArray();

// 获取所有唯一的package_name
$allPackages = array_unique(array_merge(array_keys($pgData), array_keys($pgaData)));

$mergedData = [];
foreach ($allPackages as $package) {
    // 取出对应的数据,不存在则用默认值0
    $invoiceItem = $pgData[$package] ?? ['total' => 0, 'totalamount' => 0];
    $agentItem = $pgaData[$package] ?? ['totalg' => 0, 'totalamountg' => 0];
    
    $mergedData[] = [
        'package_name' => $package,
        'total' => $invoiceItem['total'] + $agentItem['totalg'],
        'totalamount' => $invoiceItem['totalamount'] + $agentItem['totalamountg'],
        // 可选:保留原始统计值
        'invoice_total' => $invoiceItem['total'],
        'agent_total' => $agentItem['totalg'],
        'invoice_totalamount' => $invoiceItem['totalamount'],
        'agent_totalamount' => $agentItem['totalamountg']
    ];
}

// 转换为Laravel集合(可选)
$mergedResult = collect($mergedData);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:50:02