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

如何用Eloquent构建groupBy和orderBy查询获取销量Top3商品

解决Eloquent实现销量前三商品的分组求和查询问题

嘿,折腾了两小时搞这个查询,太懂这种卡壳的感觉了!你现在的核心问题是用了count(*)来统计销量,但实际上我们需要的是对商品数量求和,不是计数订单数——这也是很多人踩的坑😉

正确的查询写法

首先,我们需要按productBuy分组,对quantityOfProduct字段求和,然后降序排序取前三。直接上可运行的代码:

// 假设你的模型是Order,替换成你实际的$buyObj对应的模型类
$top3Products = Order::select(
    'productBuy',
    DB::raw('SUM(quantityOfProduct) AS total_sales') // 求和商品数量,别用count!
)
->groupBy('productBuy') // 按商品分组
->orderBy('total_sales', 'DESC') // 按销量降序
->take(3) // 取前三
->get();

关键细节说明

  • 为什么不用count?:count(*)统计的是每个商品对应的订单数,但你要的是总销量,也就是所有订单里该商品的数量总和,所以必须用SUM(quantityOfProduct)。
  • 模型类替换:如果你的查询入口不是Order模型,把它换成你代码里的$buyObj对应的模型即可。
  • 可选:过滤有效订单:如果只需要统计已完成的订单(比如排除取消、待支付的),可以在groupBy前加过滤条件:
    $top3Products = Order::select(
        'productBuy',
        DB::raw('SUM(quantityOfProduct) AS total_sales')
    )
    ->where('statusOfOrder', 'completed') // 这里替换成你实际的"已完成"状态值
    ->groupBy('productBuy')
    ->orderBy('total_sales', 'DESC')
    ->take(3)
    ->get();
    
  • 批量赋值注意:确保productBuy字段在模型的$fillable数组里,或者设置了$guarded = [],避免字段被过滤。

结果使用示例

拿到结果后,你可以这样遍历输出:

foreach ($top3Products as $product) {
    echo "商品:{$product->productBuy},总销量:{$product->total_sales}\n";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:46:55