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();
代码解释:
- 关联表:确保关联的是正确的
order_items表(你原来写的orders_item应该是笔误,如果你的表名确实是这个,记得改成对应的) - 日期筛选:用
today()替代date('Y-m-d'),符合Laravel的最佳实践,也避免手动格式化日期的错误 - 统计总销量:用
SUM(order_items.quantity)计算每个产品今日被购买的总数量,并起别名total_sold方便后续使用 - 分组排序:按产品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
相关产品推荐
相关产品推荐

