Laravel查询如何按两个字段排序并给指定字段更高优先级
问题原因
你当前的代码存在两个核心问题:
- 方法调用顺序错误:Laravel查询构造器的方法执行逻辑和SQL执行逻辑对应,
take()(对应SQL的LIMIT)要在orderBy()之后调用才会先排序再取前10条。你把take(10)放在最前面,会导致数据库先随机取10条记录,再对这10条做排序,根本拿不到最新创建的10条数据。 - 排序逻辑不符合需求:你直接在SQL查询中拼接两个
orderBy,对应的逻辑是全局所有数据先按created_at降序排序,created_at相同的条目再按order降序排序,最后取前10条,并不是你要的「先取最新10条,再在这10条里按order优先级排序」的逻辑。
正确实现
分两步执行即可:
- 先从数据库查询出按
created_at降序的前10条数据 - 对取出的集合结果在内存中按
order字段降序重排
代码示例:
// 第一步:查询最新创建的10条记录 $notes = Note::orderBy('created_at', 'desc')->take(10)->get(); // 第二步:对这10条记录按order字段降序重排,values()用于重置集合索引为连续值 $notes = $notes->sortByDesc('order')->values();
内容的提问来源于stack exchange,提问作者Farshad
相关产品推荐
相关产品推荐

