thinkphp分页链接丢失原有get参数是默认行为,需用appends()显式追加并过滤page(或自定义var_page值);必须使用render()输出分页html才能生效。

ThinkPHP分页链接丢失原有 GET 参数
默认情况下,paginate() 生成的分页链接只保留 page 参数,其他 GET 参数(比如 ?keyword=abc&status=1)会被清空。这不是 bug,而是框架默认行为——分页器不主动合并请求参数,需手动干预。
使用 appends() 显式追加当前 GET 参数
appends() 是最直接、最可控的方式,它把指定键值对附加到分页链接的查询字符串中。关键点是:必须传入「当前请求的所有有效 GET 参数」,且要过滤掉 page(避免重复)。
- 在控制器中调用分页后,链式调用
appends(),传入input('get.')(ThinkPHP 6.x)或input('param.')(兼容带路由变量的场景) - 手动剔除
page键:例如array_filter(input('get.'), function($k) { return $k !== 'page'; }, ARRAY_FILTER_USE_KEY) - 如果用了 URL 路由且参数混在 path 中(如
/list/status/1),需先用request()->param()获取全部参数再过滤
示例(TP6):
$list = Db::name('article')->where($where)->paginate(10);
$list->appends(array_filter(input('get.'), function($k) { return $k !== 'page'; }, ARRAY_FILTER_USE_KEY));
$this->assign('list', $list);
全局配置 var_page 不影响参数合并逻辑
有人误以为修改 paginate 的 var_page(如设为 'p')能自动保留其他参数,其实不能。var_page 只控制分页参数名,和参数合并无关。所有非 page 参数仍需靠 appends() 显式注入。
-
var_page影响的是分页链接里页码参数的 key,比如?p=2而不是?page=2 - 即使改了
var_page,appends()里仍要过滤掉这个新 key(如过滤'p'),否则会重复 - 模板中渲染分页时,
$list->render()自动识别当前var_page值,无需额外处理
模板中不要手动拼接分页链接
常见错误是放弃 $list->render(),改用 foreach 遍历 $list->render() 返回的 HTML 或自己写 <a href="?page=...&xxx"></a>。这样会彻底绕过 appends() 机制,原有 GET 参数必然丢失。
- 始终用
{$list->render|raw}(TP6 模板语法)或{{ $list->render() }}(Blade 风格)输出分页 HTML -
render()内部已集成appends()注入的参数,只要控制器里调用了,就自动生效 - 若需自定义分页 HTML 结构,应继承
Think\Paginator\Driver\Bootstrap并重写getLinks(),而非手写链接
真正容易被忽略的是:参数过滤必须严格匹配当前使用的页码参数名(page 或自定义的 p),漏掉这一步,链接里就会出现 ?page=2&page=2 这类重复参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











