tp6的paginate()返回paginator对象而非数组,字段名改为per_page、current_page等laravel风格,total为int,data需用items()显式获取;适配旧接口应手动组装tp5风格数组。

TP6 的 paginate() 返回的是对象,不是数组
直接 return $query->paginate(10) 给前端,拿到的不是你熟悉的 data 字段扁平结构,而是一个 think\Paginator\Bootstrap 实例。它有方法(如 items()、currentPage()),但没有原生 data 键;JSON 序列化时走的是自定义 jsonSerialize(),字段名变成 per_page、current_page、last_page 等 Laravel 风格命名。
常见错误现象:
- 前端收不到
data字段,或total变成字符串 - 用
$paginator->toArray()拿数据,结果data里还是个Collection对象,JSON 后嵌套过深 - 误以为
render()能输出分页 HTML 就代表结构兼容,其实它和数据格式无关
正确做法是显式提取:
- 用
$paginator->items()拿原始数据列表(返回数组) - 用
$paginator->currentPage()、$paginator->lastPage()、$paginator->total()等方法取元信息 - 手动组装返回数组,字段名对齐旧版(
data、current_page、total、has_next_page)
TP8 的分页默认启用协程安全连接池,但写法不变
TP8 下 Db::table('user')->where(...)->paginate(15) 看起来和 TP6 一样,但底层已切换为协程感知的连接池 —— 这意味着在 Swoole 协程环境下,多次分页查询可复用同一个 PDO 连接,避免频繁创建/销毁连接开销。
但这个优势有前提:
- 必须运行在 Swoole ≥ 5.1 +
enable_coroutine=1环境下,FPM 模式下无此优化 - 不能混用非协程函数(如
file_get_contents、curl_exec),否则整个协程挂起,分页反而变慢 -
config('database')返回的是协程安全配置对象,不是原始数组,var_dump看不到真实参数
如果你还在 FPM 下跑 TP8,分页性能基本和 TP6 持平,别指望靠升级框架自动提速。
TP6 和 TP8 的分页构造器调用链差异影响调试
TP6 的 paginate() 最终调用的是 think\Paginator\driver\Bootstrap::make(),所有分页逻辑(SQL 构造、COUNT 查询、OFFSET/LIMIT 计算)都在同步上下文中完成;TP8 则在构造器中注入了 think\db\ConnectionPool,COUNT 查询和主查询可能被调度到不同协程任务中执行。
这带来两个实际影响:
- 开启 QueryLog 时,TP8 的日志顺序可能错乱:先记主查询 SQL,后记 COUNT SQL,甚至漏记其中一个
-
Db::getLastSql()在 TP8 中只反映最后一次执行的 SQL,无法可靠还原分页完整语句链 - TP6 中能用
Db::listen()拦截全部 SQL,TP8 需配合think\db\ConnectionPool::onQuery才能捕获池内所有查询
调试分页问题时,别只盯着 getLastSql(),TP8 下建议直接看 slowlog 或用 strace -e trace=sendto,recvfrom 抓真实 MySQL 流量。
TP8 分页不兼容 TP6 的 page 参数解析方式
TP6 允许通过 URL 参数 ?page=2 或 ?p=2(如果配置了 page_name)触发分页;TP8 默认只认 page,且对参数类型更严格:若传入非整数(如 ?page=abc),TP6 会静默转为 1,TP8 直接抛出 InvalidArgumentException。
更隐蔽的问题是路由变量干扰:
- TP6 中
route('user/page', ['page' => 2])能正常生成 URL - TP8 中若路由定义含
:page变量(如'user/:page'),且控制器又调用paginate(),框架可能把路由变量和分页参数混淆,导致currentPage()返回错误值 - TP8 要求分页参数名必须全局唯一,不能和路由变量同名,否则需显式指定
pageName选项(如paginate(10, false, ['pageName' => 'p']))
升级时务必检查所有分页入口的 URL 构造逻辑和路由定义,尤其注意前后端约定的参数名是否冲突。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











