ThinkPHP 6 的 render() 不返回总页数,需调用 $paginator->lastPage() 获取整数形式的总页数;空数据时仍返回 1,per_page 为 0 会触发除零错误,须前置校验。

ThinkPHP 6 的 render() 不返回总页数,得换方法
ThinkPHP 自带的分页对象(如 LengthAwarePaginator)在调用 render() 时只生成 HTML,不暴露总页数。如果你写的是 API 接口,需要返回 total_pages 字段,不能靠解析渲染结果——那既慢又不可靠。
正确做法是直接从分页实例中取属性:
-
$paginator->lastPage()返回总页数(整数),这是最常用、最稳的方式 -
$paginator->total()返回总记录数,除以per_page可手动算页数,但要注意向上取整(ceil($total / $per_page)),不如lastPage()直接 - 别用
$paginator->currentPage()或$paginator->hasPages()混淆概念——它们跟总页数无关
ThinkPHP 5.1/6.x 分页对象结构差异影响取值方式
TP5.1 默认用 think\Paginator,TP6.x 默认用 think\pagination\driver\Bootstrap 驱动的 LengthAwarePaginator,但两者都兼容 lastPage() 方法。不过要注意初始化方式:
- TP6 中通过
paginate()查询得到的对象,可直接调lastPage() - TP5.1 若手动 new
Paginator,需确保传入了$total和$listRows,否则lastPage()返回 0 - 若用了自定义分页类或第三方驱动(如
layui),先var_dump($paginator)确认是否存在lastPage方法或last_page属性
API 接口里返回总页数的典型结构示例
常见 JSON 响应要包含分页元信息,不要只塞数据。比如:
立即学习“PHP免费学习笔记(深入)”;
{
"data": [...],
"meta": {
"current_page": 2,
"last_page": 15,
"per_page": 10,
"total": 147
}
}
后端构造逻辑类似:
$list = User::where('status', 1)->paginate(10);
return json([
'data' => $list->items(),
'meta' => [
'current_page' => $list->currentPage(),
'last_page' => $list->lastPage(), // ← 关键就这行
'per_page' => $list->perPage(),
'total' => $list->total(),
]
]);
容易被忽略的边界情况:空数据或 per_page=0
当查询无结果时,$list->lastPage() 仍返回 1(不是 0),这是 Laravel/TP 分页的约定行为,符合“第一页存在但没数据”的语义。但如果你的前端要求空列表时 last_page: 0,就得手动判断:
- 检查
$list->total() === 0,然后设'last_page' => 0 -
per_page为 0 会导致lastPage()报 DivisionByZeroError,务必在分页前校验参数:if ($pageSize - 数据库 count 查询本身可能被缓存或优化掉,但
lastPage()依赖total()结果,所以确保你的模型没有意外覆盖total()方法
总页数不是渲染副产品,而是分页计算的核心中间值——只要拿到分页对象,就该优先信任 lastPage(),而不是去 parse HTML 或重算 count。



















