Laravel如何通过单数据库查询实现按布尔值分组取指定数量记录并排序
单查询实现方案:获取指定数量的Bool字段不同值的记录并排序
没问题!你想要的单查询方案完全可以实现,核心思路是利用SQL的UNION操作来合并两个各自取5条结果的子查询,然后再统一排序。在Laravel里可以这样写:
实现代码
// 先构建两个子查询,分别获取5条bool为true和false的记录 $trueRecords = Test::where('bool', true)->take(5); $falseRecords = Test::where('bool', false)->take(5); // 合并两个查询并按bool降序排序 $result = $falseRecords->union($trueRecords)->orderByDesc('bool')->get();
或者更简洁的链式调用写法:
$result = Test::where('bool', false)->take(5) ->union(Test::where('bool', true)->take(5)) ->orderByDesc('bool') ->get();
原理说明
这种方式只会向数据库发起一次查询,Laravel会将其编译成包含UNION的原生SQL语句,类似这样:
select * from `tests` where `bool` = 0 limit 5 union select * from `tests` where `bool` = 1 limit 5 order by `bool` desc;
- 两个子查询分别限制了只取5条对应
bool值的记录,保证结果数量符合你的需求 UNION会合并两个子查询的结果集- 最后
orderByDesc('bool')会把bool=true的记录排在前面(因为SQL中布尔值true等价于1,false等价于0,降序排序时1会排在0前面),正好符合你要的排序规则
小提示
如果你的bool字段在数据库中是用tinyint类型存储的,Laravel的where('bool', true)/where('bool', false)会自动转换为对应的1/0,不需要额外处理类型匹配问题。
内容的提问来源于stack exchange,提问作者SneakyLenny
相关产品推荐
相关产品推荐

