ThinkPHP升序排序需用order()方法并校验字段与方向以确保安全。基础写法为User::order('id asc')->select();动态排序须白名单过滤字段和方向;多字段升序用关联数组如['status'=>'asc','create_time'=>'asc'];模型可设protected $order='sort asc'实现默认升序。
ThinkPHP 实现升序排序很简单,关键在于用对方法、避开常见坑——比如直接拼接字符串容易被注入,或字段名没校验导致报错。
最常用也最直观的方式是调用 order() 方法,并传入字段名加 "asc"(升序):
User::order('id asc')->select(); → 按 id 升序查用户Article::order('create_time asc')->limit(10)->select(); → 按发布时间从早到晚取前10条'status'、'title'
如果排序字段或方向来自用户输入(比如 URL 参数 ?field=name&dir=asc),绝不能直接拼接字符串。要白名单过滤:
$allowedFields = ['id', 'name', 'create_time', 'score'];
$allowedDirs = ['asc', 'desc'];
$field = in_array($request->param('field'), $allowedFields) ? $request->param('field') : 'id';
User::order([$field => $dir])->select(); → ThinkPHP 自动转义,防 SQL 注入需要先按 A 升序、A 相同时再按 B 升序,就用关联数组写法:
立即学习“PHP免费学习笔记(深入)”;
User::order(['status' => 'asc', 'create_time' => 'asc'])->select();ORDER BY status ASC, create_time ASC
['name asc', 'age desc'] 是旧式写法,推荐统一用键值对格式想让某个模型每次查询都自动按固定字段升序,可在模型类里声明:
protected $order = 'sort asc';(TP6 写法)protected $resultSetType = 'collection'; protected $order = 'sort asc';
User::select() 就自带升序,无需每次写 order()