ThinkPHP分页必须由paginate()接管原始查询链,不能在select()/all()结果上调用;需显式传入false禁用自动解析以支持自定义参数;render()前不可调用toArray()等方法;复杂查询下total()可能不准,应手动传入总数。

ThinkPHP分页怎么实现_ThinkPHP分页类使用详解【方法】

ThinkPHP 的分页功能,说起来好像挺简单,一个方法就能搞定。但实际用起来,不少人会栽跟头:要么报错 Call to undefined method think\Collection::paginate(),要么分页数据半天出不来,或者翻页逻辑完全乱套。问题的根源,几乎都集中在 paginate() 这个方法的调用时机和上下文上。简单来说,它必须接管原始查询链,否则一切免谈。

paginate() 必须链式调用,不能在数组或集合上调用

一个非常典型的错误是,先通过 select()all() 把数据全取出来,然后才想起来分页:

手动控制 page 和 list_rows 时别漏掉 false 参数

默认情况下,paginate(10) 会自动从 $_GET['page'] 里读取当前页码,但不会去碰每页显示条数。假设你想通过 ?page=2&size=20 这样的参数来控制分页,就必须显式地关闭自动解析:

render() 前千万别调用 toArray() 或 json()

$users->render() 这个方法,依赖于分页对象的完整上下文——总条数、URL 配置、当前页等。一旦你在它之前做了下面这些动作,render() 就会彻底罢工:

对于 API 场景,建议单独提取分页字段:['data' => $users->items(), 'total' => $users->total(), 'per_page' => $users->listRows(), 'current_page' => $users->currentPage()]。这样既拿到了数据,又不影响 render() 的后续调用。

total() 是缓存值,复杂查询下可能不准

需要区分清楚:$users->count() 返回的是当前页的数据量(比如 10 条),而不是全表总数;真正起作用的,是 $users->total(),它才是分页时那条 COUNT 查询的结果。但这里有个隐藏陷阱:

说到底,分页的本质无非是“一次 COUNT + 一次 LIMIT”这两条 SQL 的配合。大多数翻车情况,都不是方法不会用,而是没让框架抓住那个原始查询的源头。搞明白了这一点,很多问题也就迎刃而解了。

本文转载于:https://www.php.cn/faq/2461795.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。