发布于2026-07-11 阅读(0)
扫一扫,手机访问
ThinkPHP 实现倒序排列,说穿了就是 order() 方法配合 desc 方向,一句话的事儿,根本不需要什么复杂的循环或额外逻辑。
来看看最直接的方式:用 order('字段名 desc') 搞定。这招的好处是数据库层直接干活,效率高,逻辑也清晰。比如你想让文章列表按照发布时间从新到旧排,那就 $model->order('addtime desc')->select();;按 ID 倒序,让最新的记录排前面,就是 $model->order('id desc')->select();。如果需求更复杂,比如先按状态升序、再按创建时间倒序,那就来个多字段组合:$model->order('status asc, create_time desc')->select();。这组合拳打出来,基本能覆盖大部分业务场景。
不过,这里有个坑必须注意:动态字段倒序要防注入。很多开发者图省事,直接把用户输入(比如 URL 参数里的 sort_field)拼到 order() 里,这就危险了。正确的做法是搞个白名单校验,比如先定义好允许的字段列表:$allowFields = ['id', 'addtime', 'sort_num', 'name'];,然后从输入里取字段值,如果不在白名单里就强制用默认值。这样写,既灵活又安全。千万别图省事写成 $model->order(input('sort_field') . ' desc')->select();,否则,你写出来的代码看似没问题,一上线就等着被“问候”吧。
带分页的时候,倒序排序也别漏了。分页和排序要配合使用,顺序不重要,但建议把 order() 写在 paginate() 前面,这样逻辑更直观。比如 $model->order('id desc')->paginate(10);,完美。或者 TP6+ 里也可以链式调用,效果一样。但如果忘了写 order(),直接来个 $model->paginate(10);,那结果默认按主键升序排列,你想要的“最新在前”就泡汤了。这是最常见的新手坑,别踩。
最后聊聊“置顶”功能。倒序排序本身不解决置顶,但可以配合实现。常见的有两种思路:一种是“时间戳法”,点置顶的时候把 addtime 更新成当前时间戳,再按 order('addtime desc') 排序,刚置顶的自然就跑到最前面了。另一种是“权重字段法”,额外加个 top_weight 字段(int 类型),置顶时设成高值(比如 999),查询时写成 order('top_weight desc, addtime desc'),先按权重排,权重一样的再按时间排。这两种方法都很实用,选哪种就看你的具体场景了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8