ThinkPHP分页需显式保留搜索参数:TP5/TP6早期用paginate(['query'=>request()->param()]),TP6.0.12+推荐withQuery()处理数组参数,避免appends()丢失方括号语义。

分页链接不带搜索参数,翻页后条件就丢了——这不是 bug,是默认行为。ThinkPHP 的 paginate() 不会自动保留当前 URL 查询参数,必须显式传入。
用 query 参数在 paginate() 里一次性传参
这是最直接、兼容性最好的方式,尤其适合 TP5 和 TP6 早期版本。
-
query必须作为配置数组传入paginate(),不能写成paginate(10, false, [...])这种老式三参数形式(TP6 已废弃) - 正确写法:
paginate(['list_rows' => 10, 'query' => request()->param()]) -
request()->param()会自动过滤page,避免出现page=1&page=2冲突 - 如果只想要部分参数(比如只传
keyword和status),手动构造数组:['keyword' => input('keyword'), 'status' => input('status')] - 注意:伪静态路由下,
query参数仍以 query string 形式拼在末尾,不会变成 path segment
TP6.0.12+ 用 withQuery() 保留完整结构化参数
当你的 URL 里有数组参数(如 filter[status]=1&filter[category][]=a&filter[category][]=b),appends() 会丢掉方括号语义,withQuery() 才是正解。
- 调用时机:必须在 assign 到模板前,且不能和
appends()混用 - 用法简单:
$list->withQuery($_GET)或$list->withQuery(request()->param()) - 它内部做了 key 保留、
page自动剔除、URL 编码还原等处理,比手写flatten_params()更可靠 - 低版本 TP6(
appends() 适合固定参数,但容易踩坑
如果你只是想让所有分页链接都带上 site_id=3&lang=zh-cn 这类不变的业务标识,appends() 轻量够用;但一碰动态搜索参数就容易出问题。
立即学习“PHP免费学习笔记(深入)”;
- 必须在
render()前调用,写在assign()后面就无效 - 传数组时若含嵌套(如
['filter' => ['status' => 1]]),框架不会自动展开,生成的链接是?filter[status]=1,后端可能收不到 - 和
query配置同时存在时,同名键会被appends()覆盖——这点常被忽略,导致调试时参数“莫名消失” - 别在模板里反复链式调用:
{$list->appends(...)->appends(...)->render()},每次调用都会叠加,容易重复拼参
真正麻烦的不是怎么加参数,而是参数加进去之后后端收不到——常见于数组键含方括号、前后端编码不一致、或伪静态规则误吞 query string。优先用 withQuery()(TP6.0.12+)或 query 配置(全版本),比修 U() 函数或手写 flatten 安全得多。



















