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

Laravel查询问题:如何获取今日销量Top5产品?

修正Laravel获取今日销量Top5产品的查询

我来帮你搞定这个查询问题~ 先说说你原来代码里的几个核心问题:

  • 错误地按id_order分组,这样是把每个订单当成一组,根本没法统计单个产品的总销量
  • 用max('quantity')取的是单条订单项里的最大购买数量,不是某个产品今天被购买的总数量,自然拿不到Top5的销量产品
  • 两次查询的方式不仅冗余,逻辑上也完全偏离了“统计产品总销量”的需求

下面是修正后的查询代码,直接就能拿到今日销量最高的5个产品:

use Illuminate\Support\Facades\DB;

$mostSoldProductsToday = Order::join('order_items', 'orders.id', '=', 'order_items.id_order')
    // 筛选今日的订单,用Laravel自带的today()更简洁规范
    ->whereDate('orders.created_at', '=', today())
    // 选择产品ID,并计算每个产品的总销量
    ->select('order_items.id_product', DB::raw('SUM(order_items.quantity) as total_sold'))
    // 按产品ID分组,这样才能统计每个产品的总销量
    ->groupBy('order_items.id_product')
    // 按总销量从高到低排序
    ->orderByDesc('total_sold')
    // 取前5个销量最高的产品
    ->take(5)
    ->get();

代码解释:

  1. 关联表:确保关联的是正确的order_items表(你原来写的orders_item应该是笔误,如果你的表名确实是这个,记得改成对应的)
  2. 日期筛选:用today()替代date('Y-m-d'),符合Laravel的最佳实践,也避免手动格式化日期的错误
  3. 统计总销量:用SUM(order_items.quantity)计算每个产品今日被购买的总数量,并起别名total_sold方便后续使用
  4. 分组排序:按产品ID分组后,按总销量降序排列,最后用take(5)取前5个结果

如果你还需要获取产品的名称、价格等详细信息,可以再关联products表:

$mostSoldProductsToday = Order::join('order_items', 'orders.id', '=', 'order_items.id_order')
    ->join('products', 'order_items.id_product', '=', 'products.id')
    ->whereDate('orders.created_at', '=', today())
    ->select('products.id', 'products.name', 'products.price', DB::raw('SUM(order_items.quantity) as total_sold'))
    // 开启Laravel严格模式的话,select里的非聚合字段都要加入groupBy
    ->groupBy('products.id', 'products.name', 'products.price')
    ->orderByDesc('total_sold')
    ->take(5)
    ->get();

这样就能拿到包含产品详情和总销量的Top5列表啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:34:30