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

如何在Eloquent中按Agent分组统计关联产品佣金总和并排序

解决方案

你可以通过两种方式实现按agent分组统计总佣金并排序的需求,以下是具体实现:

方式一:使用查询构造器直接关联表查询

这种方式效率较高,直接通过SQL关联两张表完成统计:

use Illuminate\Support\Facades\DB;

$stats = DB::table('sales')
    ->join('products', 'sales.product', '=', 'products.product')
    // 生成自增序号id,匹配预期结果格式
    ->selectRaw('ROW_NUMBER() OVER (ORDER BY SUM(products.commission) DESC) as id')
    ->select('agent', DB::raw('SUM(products.commission) as commission'))
    ->groupBy('agent')
    ->orderByDesc('commission')
    ->get();

这段代码会直接关联sales和products表,按agent分组后计算佣金总和,同时通过ROW_NUMBER()生成预期结果中的自增id字段,最后按总佣金倒序排列。

方式二:基于Eloquent模型关联实现

如果你想利用已定义的模型关联,可以调整查询逻辑如下:

首先建议修正你的关联关系(因为一个销售记录对应一个产品,属于多对一关系,belongsTo比hasOne更贴合业务逻辑):

// 在Sales模型中修改关联
use Illuminate\Database\Eloquent\Relations\BelongsTo;

public function product(): BelongsTo
{
    return $this->belongsTo(Product::class, 'product', 'product');
}

然后使用withSum方法统计关联模型的佣金总和,再分组排序:

$stats = Sales::query()
    ->withSum('product', 'commission')
    ->groupBy('agent')
    ->orderByDesc('product_sum_commission')
    // 重命名字段并添加自增id
    ->get()
    ->map(function ($item, $index) {
        return [
            'id' => $index + 1,
            'agent' => $item->agent,
            'commission' => $item->product_sum_commission
        ];
    });

这里通过withSum统计每个销售记录关联产品的佣金,分组后倒序,最后通过map方法手动添加自增id,匹配预期的结果格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:07:51