最可靠的方式是直接调用分页对象的lastpage()方法;tp6中为$paginator->lastpage(),tp5.1中需兼容判断method_exists($paginator, 'lastpage'),否则用ceil($paginator->total() / $paginator->listrows)。

ThinkPHP 6 获取分页总页数(最后一页页码)
直接用 $paginator->lastPage(),这是最可靠的方式。TP6 的分页对象(LengthAwarePaginator 实例)内置了该方法,它基于总记录数和每页条数实时计算,不依赖当前页或 URL 参数。
常见错误是试图用 count($list) 或 $paginator->total() 自己除——这会忽略分页器内部对 per_page 的校验逻辑,且没处理整除边界(比如 total=100、per_page=20 时结果应为 5,但浮点除法易出错)。
-
$list是分页查询结果(LengthAwarePaginator对象),不是原始数组 - 必须确保查询走的是
paginate(),而不是select()+ 手动切片,否则没有lastPage()方法 - 若使用
simplePaginate(),则无lastPage()——它不统计总数,只判断是否有下一页
ThinkPHP 5.1 获取最后一页页码的兼容写法
TP5.1 的 Paginator 对象也提供 lastPage(),但要注意:它在某些低版本(如 5.1.30 之前)可能未暴露该方法;此时可安全回退到 ceil($paginator->total() / $paginator->listRows)。
示例:
// TP5.1 中较稳妥的写法
$lastPage = method_exists($paginator, 'lastPage')
? $paginator->lastPage()
: ceil($paginator->total() / $paginator->listRows);
-
$paginator->listRows是每页数量,不是$paginator->pageSize()(后者在 TP5.1 中不存在) - 手动计算时务必用
ceil(),不能用round()或整除(int),否则 total=99、listRows=20 会得 4 而非正确值 5 - TP5.1 不支持
simplePaginate()的lastPage(),因为底层没查总数
为什么不能用 $paginator->getUrlRange(1, $paginator->lastPage()) 反推最后一页
有人尝试通过生成全部页码 URL 再取数组末尾来“倒推”最后一页,这既低效又危险:getUrlRange() 默认只返回当前页前后各 3 页(共 7 个),并非全量;即使改参数传大数,也会触发无意义的 URL 构造开销,且在开启路由缓存时可能因 URL 生成失败导致异常。
-
getUrlRange(1, 1000)不等于“获取 1 到 1000 页的链接”,而是“从第 1 页开始,最多取 1000 个连续页码的链接”,实际仍受限于分页器的lastPage()值 - 该方法不校验页码有效性,传入超出范围的页码也不会报错,只是返回空字符串
- 性能上,构造几百个 URL 字符串毫无必要,纯属浪费 CPU 和内存
分页跳转到最后一页的实际调用方式
如果目标是「跳转」而非「获取页码」,应拼接 URL 并重定向,而不是在服务端查出最后一页数据再渲染——那样会多执行一次完整查询(重复 count + limit offset)。
示例(TP6):
$lastPage = $paginator->lastPage();
return redirect()->to('/news?page=' . $lastPage);
- 不要写
$data = NewsModel::paginate(10)->lastPage();—— 这里paginate()已执行查询,lastPage()是它的返回值,不能再链式调用 - 若需在模板中输出最后一页链接,用
@#@#@#@#@#@#@#@#@#@0 - 注意分页参数名:TP6 默认是
page,TP5.1 默认是page,但若自定义过var_page配置(如设为p),URL 中也要同步替换
paginate() 查询成功执行(即数据库返回了 total),lastPage() 就是唯一可信入口;任何绕过它的推导,都容易在边缘场景(如空数据、per_page 动态变化、分页配置被覆盖)中失效。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











