Laravel查询中orderBy排序失效,多种写法均无效求助
Laravel查询orderBy排序失效问题解决
你的问题出在初始查询里的latest()方法——它已经给查询语句加上了ORDER BY created_at DESC的排序规则。当你后续追加orderByDesc('viewer')时,Laravel会把两个排序条件合并成ORDER BY created_at DESC, viewer DESC,这意味着结果会先按created_at倒序排列,只有当两条记录的created_at相同时,才会按viewer倒序。所以你看起来viewer的排序没生效。
修复方案
方案1:分条件设置排序(推荐)
直接在判断分支里分别设置不同的排序规则,避免初始排序的干扰:
$query = Post::query(); if ($request->input('popular') == 'true') { $query->where('hide_search', 0)->orderByDesc('viewer'); } else { $query->latest(); }
方案2:清空已有排序再追加
如果必须保留初始查询的其他条件,只是需要覆盖排序规则,可以用reorder()方法清空已有的排序条件,再添加新的排序:
$query = Post::query()->latest(); if ($request->input('popular') == 'true') { $query->where('hide_search', 0)->reorder()->orderByDesc('viewer'); }
额外排查点
- 确认
viewer字段是数字类型(int/bigint),如果是字符串类型,排序逻辑会按字符编码来,可能和你预期的数字大小排序不符 - 检查
where('hide_search', 0)过滤后的数据集里,viewer字段是否有不同的值——如果所有记录的viewer都一样,排序自然看不出效果 - 用
dd($query->toSql(), $query->getBindings())打印最终生成的SQL语句,直接查看排序规则是否符合预期
内容的提问来源于stack exchange,提问作者DG Hub
相关产品推荐
相关产品推荐

