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

