ThinkPHP降序排序需用order()方法并校验参数,推荐数组方式如->order(['create_time' => 'desc']),字段含点号也安全,方向参数须白名单过滤,表头切换需校验字段和方向。

ThinkPHP 实现降序排序,核心是用好 order() 方法,并确保字段名和方向都安全可控。直接写 'desc' 能跑通,但线上环境必须加校验和规范写法,否则容易被注入或出错。
降序写法推荐:数组方式最稳妥
TP6 和 TP5.1 后期都支持关联数组传参,语义清晰、自动转义、兼容多字段:
- 单字段降序:
->order(['create_time' => 'desc']) - 多字段组合:
->order(['status' => 'desc', 'sort' => 'asc', 'id' => 'desc']) - 字段含点号(如关联模型)也安全:
->order(['user.name' => 'desc']),不用手动加反引号
用户可选降序时,必须校验方向参数
前端传来的 sort_type=desc 不能直接拼接,需白名单过滤:
- 只允许
'asc'和'desc'两个值,其他一律 fallback 到默认值 - 示例代码:
`$dir = in_array($request->param('dir'), ['asc', 'desc']) ? $request->param('dir') : 'desc';`
`$list = Article::order(['create_time' => $dir])->select();`
表头点击切换升/降序的实用逻辑
常见需求是点击“创建时间”第一次降序,再点升序,需前后端配合:
立即学习“PHP免费学习笔记(深入)”;
- URL 示例:
?sort_field=create_time&sort_type=desc - 后端接收后先校验字段是否在白名单内(如
['id','title','create_time']),再决定方向 - 模板中链接动态生成:
`创建时间`
拖拽排序场景下的降序显示
拖拽后存的是自然顺序(sort=1,2,3...),要按从上到下显示,查库时得升序;若想倒序展示(最新拖到最前),就用降序:
- 常规拖拽列表:用
->order('sort', 'asc') - 顶部置顶类需求:用
->order('sort', 'desc') - 注意:
sort字段必须建索引,否则大数据量会慢



















