thinkphp的paginate()返回paginator对象而非数组,需调用toarray()才能序列化;字段名如current_page与主流框架不一致,需手动映射;page参数不自动识别url自定义键,须显式传参或配置var_page;appends()必须在paginate()后、toarray()前调用。
cursor 教程
ThinkPHP 的 默认返回一个 对象,不是纯数组,也不是直接带 字段的 JSON 结构。前端直接 会看到一堆方法、属性(比如 、),而不是你想渲染列表的 和分页元信息。
- 它本质是对象,需显式调用 才能转成可序列化的数组
- 默认结构里 是当前页数据,但 、 等字段名和 Laravel 或其他框架不一致,容易在前端适配时出错
- 如果你用 或模型的 ,它只影响 里的模型实例,不影响分页元信息字段
ThinkPHP 不提供开箱即用的「分页 JSON Schema 配置」,得靠手动组装。最稳妥的方式是取出 实例后,用 提取原始结构,再按需重键名或补字段。
- 别直接 给接口 —— 这会输出对象 toString 后的混乱字符串
- 正确做法:
- 想统一字段名(比如把 改成 , 改成 ):手动映射,例如
- 注意 是总数, 是总页数,别混淆; 是布尔值,但 后它变成 (下划线命名),且值为 或 ,不是 true/false
第一个参数是每页数量(),但它不接受 URL 中的 参数自动识别——除非你显式传入第二个参数,或配置全局分页变量名。
- 默认从 读取当前页码,但如果你的接口用的是 或 ,它就完全忽略,始终返回第 1 页
- 解决办法一:显式传参,
- 解决办法二:改全局配置,在 里设 ,这样它就会读
- URL 查询参数(如搜索条件)默认不会自动拼进分页链接,要保留它们,得用 ,例如 ,否则点击页码后搜索条件丢失
默认 会执行两条 SQL:一条 算总数,一条 取数据。当表超大、COUNT 慢时,这是瓶颈。
- 不能跳过 count —— 分页器需要总数算页数、判断是否有下一页;强行绕过会导致 为 null、 失效
- 可优化方向:用缓存存总数(比如配合 ),但要注意数据变更时清理
- 更激进的做法:用游标分页(cursor-based),但 ThinkPHP 原生不支持,得自己写 + 记录上一页最大 ID,此时就彻底避开 count
- 注意:如果用了 或复杂子查询,count 部分可能被错误地套上外层括号,导致语法错误,这时建议拆成手动 count + limit 查询
实际项目里最容易被忽略的,是 的调用时机 —— 它必须在 之后、 之前链式调用,否则生成的分页链接里压根不会带参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/279846.html原文链接:https://javaforall.net
