haspages() 判断是否需分页(total > listrows),与数据是否存在无关;isempty() 作用于 items 集合,判断当前页数据是否为空,二者不可混用。

hasPages() 是分页对象的「有无分页结构」判断,不是「有没有数据」
很多人在视图里写 if ($page->hasPages()),以为它等价于“有没有查到记录”,结果发现即使数据库返回空数组,hasPages() 仍返回 true。这是因为 hasPages() 只看分页元信息是否满足「需要分页」的条件:即 total > listRows。哪怕 total === 0,只要 listRows === 15,那 0 > 15 为 false,hasPages() 就是 false;但若 total === 16,哪怕实际数据被 where 过滤成空,只要分页器初始化时传入的 total 是 16,它就认为“该分页”。
所以你看到的「分页栏还在但没数据」,往往是因为:
- 分页前没做
COUNT或用了缓存的旧total值 -
paginate()调用时传了手动计算的total,但和实际select()结果不一致 - 启用了
simple分页(只查当前页数据,不 COUNT),此时total是估算值或默认值
isEmpty() 在分页对象里调的是 Collection 的方法,不是 Query 的
分页对象(如 think\Paginator)本身没有 isEmpty() 方法。当你对分页实例调 $page->isEmpty(),实际触发的是其内部 items 属性——也就是数据集(think\model\Collection)的 isEmpty()。
这意味着:
- 它判断的是「当前页查出来的这批数据是否为空」,和总条数、分页逻辑完全无关
- 必须确保
items确实是Collection实例;如果配置了'resultset_type' => 'array',$page->items就是数组,调isEmpty()会报Fatal error - TP6/8 默认开启 Collection,但 TP5.1 的
paginate()返回的items是数组,此时不能直接用isEmpty()
正确写法示例:
if ($page instanceof \think\Paginator && $page->items() instanceof \think\model\Collection) {
$hasData = !$page->items()->isEmpty();
} else {
$hasData = !empty($page->items());
}
视图中判断「真·没数据」应优先看 items 本身类型
别依赖单一方法兜底。最稳的路径是先明确你拿到的是什么:
- 用
var_dump($page->items())看一眼返回值类型,比翻文档快十倍 - 如果是
Collection,直接$page->items()->isEmpty() - 如果是数组,用
empty($page->items())或count($page->items()) === 0 - 不要对
$page本身调isEmpty()—— 它不是所有 Paginator 子类都实现的方法(比如SimplePaginator就没有)
常见错误:if (!$page->items())。这在 Collection 上永远为 true(对象转布尔为 true),在空数组上为 false,行为不一致且不可靠。
hasPages() 和 isEmpty() 混用时的典型陷阱
这两个方法解决的是完全不同的问题,强行组合容易产生逻辑漏洞:
-
!$page->hasPages() && $page->items()->isEmpty()≠ “完全没有数据”——可能只是 total ≤ listRows,但当前页恰好为空(比如第 1 页被删光了) -
$page->hasPages() && !$page->items()->isEmpty()≠ “有下一页”——hasPages()不保证 nextPageUrl 有效,items()也不包含下一页数据 - 真正要判断「要不要显示分页栏 + 数据列表」,应拆成两步:
– 数据是否存在:$page->items()->isEmpty()(确认类型后)
– 分页结构是否必要:$page->hasPages()(仅用于渲染分页 HTML)
最容易被忽略的一点:Paginator 对象的 items() 是懒加载的,首次调用才从查询结果中取值。如果你在控制器里已经做了 $page->items() 并赋给了模板变量,视图里再调一次,不会重复查库,但要注意别在条件分支里漏判类型。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











