Laravel如何将orders表单条件多count统计合并为一条查询
合并多条件计数查询的实现方法
你现在用的是Laravel Eloquent查询构造器,直接通过条件聚合就可以把3次查询合并为1次,大幅降低数据库IO开销,尤其适合订单表数据量较大的场景:
实现代码
$orderStats = Order::query() // 统计总订单数 ->selectRaw('COUNT(*) AS total_order_count') // 统计状态为new的订单数 ->selectRaw("SUM(CASE WHEN status = 'new' THEN 1 ELSE 0 END) AS new_order_count") // 统计状态为completed的订单数 ->selectRaw("SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_order_count") ->first(); // 直接从查询结果中取值即可 $orderCount = $orderStats->total_order_count; $newOrderCount = $orderStats->new_order_count; $completedOrderCount = $orderStats->completed_order_count;
原理说明
COUNT(*)直接统计全表所有行的数量,等价于你原来的Order::count()结果SUM(CASE WHEN 条件 THEN 1 ELSE 0 END)相当于逐行判断是否满足条件:满足就计数+1,不满足就加0,最终求和结果就是对应条件的记录总数- 如果你使用的数据库支持
IF函数(比如MySQL),还可以把CASE WHEN简写为更简洁的写法:->selectRaw("SUM(IF(status = 'new', 1, 0)) AS new_order_count")
内容的提问来源于stack exchange,提问作者Simon Davey
相关产品推荐
相关产品推荐

