ThinkPHP按创建时间排序核心是order()方法,需注意分页保持、URL参数传递、搜索器写法及多条件组合;基础写法为$order('create_time desc/asc'),动态排序用搜索器配合withSearch,日期分组用orderRaw,数组排序用array_multisort或usort。

ThinkPHP 按创建时间排序,核心是用 order() 方法指定字段和方向,但实际落地时要注意分页保持、URL 参数传递、搜索器写法和多条件组合等细节。直接写 $model->order('create_time desc') 能跑通基础场景,但线上项目常因跳页重置、参数丢失或时间格式问题出错。
基础排序写法
控制器中直接调用即可,适用于固定排序需求:
- 倒序(最新在前):
$list = UserModel::where('status', 1)->order('create_time desc')->paginate(10); - 升序(最早在前):
$list = UserModel::where('status', 1)->order('create_time asc')->paginate(10); - 多字段组合:
->order('create_time desc, id desc'),优先按时间,时间相同时再按 ID 排
带 GET 参数的动态排序(点击表头切换)
前端点击“创建时间”列时,需传参 create_time=desc 或 create_time=asc,后端通过搜索器响应:
- 模型中定义搜索器:
public function searchCreateTimeAttr($query, $value) { return $value ? $query->order('create_time', $value) : ''; } - 控制器调用:
UserModel::withSearch(['create_time'], request()->param())->paginate(['query' => request()->param()]) - 模板链接要保留当前页码:
{:url('user/index', ['create_time' => $orderRule, 'page' => input('page', 1)])},否则点排序会跳回第一页
按日期(非精确到秒)分组排序
如果想“按天聚合再排序”,比如同一天的数据排在一起,不能只靠 create_time 字段原值,得用 SQL 函数:
立即学习“PHP免费学习笔记(深入)”;
- 使用
orderRaw():->orderRaw("DATE_FORMAT(create_time, '%Y-%m-%d') desc, create_time desc") - 效果等价于 SQL:
ORDER BY DATE_FORMAT(create_time, '%Y-%m-%d') DESC, create_time DESC - 注意:该写法依赖 MySQL,且字段需为 datetime 或 timestamp 类型
数组内时间排序(非数据库查询)
合并多个来源数据(如查库 + API 返回)后需本地排序,用 PHP 原生函数处理:
- 先统一提取时间戳:
$timestamps = array_column($data, 'create_time'); - 转为时间戳并降序排列:
array_multisort(array_map('strtotime', $timestamps), SORT_DESC, $data); - 或用 usort:
usort($data, function($a, $b) { return strtotime($b['create_time']) - strtotime($a['create_time']); });



















