$paginator->total() 是获取分页总条数的正确方法;tp6 中 $paginator->total 属性已废弃,$paginator->count() 仅返回当前页条数,非总数。

ThinkPHP 6.x 中 paginate() 返回的总条数在哪找
直接说结论:$paginator->total() 是获取分页总条数的正确方法,不是 $paginator->total 属性(该属性在 TP6 中已废弃),也不是 $paginator->count()(那是当前页数据条数)。
常见错误是把分页对象当数组或普通对象直接取 total 字段,结果返回 null 或 0 —— 因为 TP6 的 LengthAwarePaginator 实例把 total 封装成了方法。
$list = User::where('status', 1)->paginate(10);- ✅ 正确:获取总条数 →
$list->total() - ❌ 错误:尝试读属性 →
$list->total(返回 null) - ❌ 错误:混淆当前页数量 →
$list->count()(返回最多 10)
TP5.1 和 TP6 的 total() 行为差异
TP5.1 中 $page->total 是可读属性,TP6 升级后统一为方法调用,且底层改用 Laravel 的 LengthAwarePaginator,所以兼容性上不能混用。
如果你从 TP5 迁移过来,搜索代码里所有 ->total 并批量替换成 ->total(),否则线上分页显示“共 0 条”。
- TP5.1:
$page->total✅ 可用 - TP6.x:
$page->total❌ 返回 null;必须用$page->total() - 两者都支持
$page->lastPage()、$page->currentPage()等方法,但只有total从属性变成了方法
为什么不能用 count() 替代 total()
count() 返回的是当前页实际查出的记录数(比如第 3 页只查到 7 条,就返回 7),而 total() 是对全表符合条件的数据执行 COUNT(*) 得到的总数(比如总共 237 条)。
这个区别在最后一页特别明显:如果每页 10 条,共 237 条,那么第 24 页 count() 返回 7,但 total() 仍返回 237 —— 分页器 UI 显示“共 237 条”靠的就是它。
- 需要显示「当前页有几条」→ 用
$list->count() - 需要显示「一共多少条」「算总页数」→ 必须用
$list->total() - 手动计算总页数?别自己除:用
$list->lastPage(),它内部已基于total()和listRows算好
自定义查询时漏掉 total() 导致分页异常
用 Db::table()->where(...)->paginate() 没问题,但如果你手写子查询、join 或用了 withCount() 等复杂场景,TP 可能无法自动推导 COUNT SQL,导致 total() 返回 0。
这时候要检查日志里的 COUNT 查询是否报错,或者手动传入总条数:
$users = Db::table('user')
->where('status', 1)
->paginate(15, false, ['query' => request()->param()]);
// 如果 total() 为 0,说明 COUNT 失败,可 fallback:
$total = Db::table('user')->where('status', 1)->count();
$users->setTotal($total);
注意:setTotal() 是 TP6.1+ 支持的方法;低于此版本需重实例化分页器,操作成本高 —— 所以优先排查 COUNT SQL 是否被 join 或 group by 破坏。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











