thinkphp倒序排列用order('字段名 desc')实现,支持单字段、多字段组合及分页;动态字段需白名单校验防注入;置顶可通过时间戳或权重字段配合倒序实现。

ThinkPHP 实现倒序排列,核心就是用 order() 方法指定字段 + desc 方向,一句话就能搞定,不需要额外逻辑或循环。
直接用 order('字段名 desc') 就行
这是最常用、最推荐的方式,数据库层直接排序,高效又清晰:
- 查文章按发布时间倒序(最新在前):
$model->order('addtime desc')->select(); - 按 ID 倒序(ID 大的排前面):
$model->order('id desc')->select(); - 多字段组合:先按 status 升序,再按 create_time 倒序:
$model->order('status asc, create_time desc')->select();
动态字段倒序要防注入
如果排序字段来自用户输入(比如 URL 参数),不能直接拼接,得做白名单校验:
- 安全写法示例:
$allowFields = ['id', 'addtime', 'sort_num', 'name'];<br> $field = input('sort_field', 'addtime');<br> if (!in_array($field, $allowFields)) {<br> $field = 'addtime';<br> }<br> $model->order($field . ' desc')->select(); - 切忌这样写(危险):
order(input('sort_field') . ' desc')—— 可能导致 SQL 注入
带分页时倒序别漏掉 order
分页和排序要一起用,顺序不影响结果,但建议写在分页前更直观:
- 正确:
$model->order('id desc')->paginate(10); - 也正确(效果一样):
$model->paginate(10)->order('id desc');(TP6+ 支持链式调用) - 错误:
$model->paginate(10);—— 没写 order,默认按主键升序,不是你想要的“最新在前”
想“置顶”就改时间戳或加权重字段
倒序本身不解决置顶,但可以配合实现。常见两种思路:
-
时间戳法:点击置顶时,把
addtime设为当前时间戳,再order('addtime desc'),刚置顶的自然跑到最前 -
权重字段法:新增
top_weight字段(int 类型),置顶时设为高值(如 999),查询写成:order('top_weight desc, addtime desc')—— 先按权重排,权重相同再按时间排
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











