ThinkPHP 3.2.2 迁移至 5.1 需替换手动 Page 实例化为 paginate() 方法,控制器改用 Db::name()->where()->paginate(),模板中须用 {$list->render()|raw},并建复合索引优化深分页性能。

ThinkPHP 3.2.2 迁移到 5.1 时,分页逻辑和调用方式变化较大,不能直接复用原 Think\Page 类。核心改造点在于:取消手动实例化分页类、改用内置 paginate() 方法、适配参数传递与模板渲染方式,并注意性能优化细节。
控制器中分页写法替换
TP3.2 常用写法:
$count = M('user')->where($where)->count();
$Page = new \Think\Page($count, 10);
$show = $Page->show();
$list = M('user')->where($where)->limit($Page->firstRow.','.$Page->listRows)->select();
$this->assign('list', $list);
$this->assign('page', $show);
TP5.1 对应改造为:
- 用
Db::name()或模型替代M(); - 直接链式调用
paginate(每页条数, 是否统计总数); - 关闭 totalCount 可显著提速(尤其大数据量),传
false即可; - 需保留搜索参数时,必须显式添加
appends(request()->param());
示例:
立即学习“PHP免费学习笔记(深入)”;
$where = ['status' => 1];
$list = Db::name('user')
->where($where)
->order('id desc')
->paginate(10, false, ['query' => request()->param()]);
$this->assign('list', $list);
模板中分页 HTML 渲染调整
TP3.2 模板直接输出 {$page};TP5.1 必须用 render() 方法生成 HTML,并加 |raw 防转义:
- 基础用法:
{$list->render()|raw}; - 如关闭了总数统计,需改用简单分页:
{$list->simple()->appends(request()->param())->render()|raw}; - 若使用自定义分页插件(如 extend/page),需指定
type参数并确保配置生效;
注意:不加 |raw 会导致 HTML 被转义成纯文本,分页不可点击。
数据库层性能关键改造
TP5.1 分页慢常因 MySQL 深分页(如 LIMIT 9990,20)导致全表扫描。必须同步优化:
- WHERE 条件字段 + ORDER BY 字段需建复合索引,例如
(user_id, create_time); - 确保时间字段等 NOT NULL,否则索引可能失效;
- 超 10 万数据且需翻页到百页以上,建议迁移到游标分页(基于 id 或时间戳的 where > last_id 查询);
- 避免在分页前先执行
count(),除非业务强依赖总页数;
兼容性与常见报错处理
迁移后易出现的分页相关问题及解法:
-
“Class 'Think\Page' not found”:删掉所有
new \Think\Page实例化代码,不再引入该类; -
分页链接丢失 GET 参数:确认是否漏了
appends(request()->param()); -
样式错乱或无分页 HTML 输出:检查是否用了
|raw,以及分页对象是否正确赋值给模板变量; -
Public.php 冲突:TP5.1 不允许类名为
Public,需重命名为Publics并同步更新路由与模板引用路径;



















