必须手动在paginate()的query配置中传入筛选参数,如['query' => request()->only(['keyword', 'status'])],否则分页跳转会丢失GET条件;表单method须为get,POST提交无法继承参数。

ThinkPHP 分页时保留筛选条件的 GET 参数
分页跳转后筛选条件丢失,是因为 paginate() 默认只生成基础分页 URL,不自动携带当前请求的查询参数。必须手动把筛选字段注入分页链接。
常见错误是直接用 $list->render() 渲染,结果第2页点开就清空了 keyword、status 等参数。
- 在控制器中调用
paginate()前,先收集所有需要透传的筛选参数:$filter = $request->only(['keyword', 'status', 'category_id'], 'get');
- 把
$filter作为第二个参数传给paginate():$list = $model->where($where)->paginate(10, false, ['query' => $filter]);
- 注意:第三个参数是配置数组,
query键必须是关联数组,不能是字符串或数字索引数组
表单用 GET 提交筛选条件才能和分页天然兼容
如果用 POST 提交筛选表单,分页链接无法继承这些数据,因为分页跳转是 GET 请求。强行混用会导致第2页丢失条件、刷新页面重提表单、浏览器前进后退异常等问题。
- 模板中表单 method 必须为
get: - 已有筛选值要回填到表单控件的
value属性,避免用户修改后点分页返回空值:<input name="keyword" value="<?= input('get.keyword', '') ?>"> - 隐藏域不是必须的,但如果有固定不可变参数(如
type=product),可用配合$request->only()一并提取
paginate() 的 false 和 true 第二个参数区别
第二个参数控制是否“简单分页”,它直接影响 SQL 查询方式和分页对象能力,和筛选参数无关,但常被误配导致翻页异常。
-
paginate(10, false, [...]):执行带COUNT(*)的完整分页,支持总页数、总记录数、首页/尾页等全部方法 -
paginate(10, true, [...]):只查当前页数据 + 一条额外记录判断是否有下一页,不查总数,$list->lastPage()会报错 - 如果你用了
render()模板且含“共 XX 条”文字,必须用false,否则$list->total()返回 0
自定义分页样式时 query 参数容易被覆盖
手写分页 HTML 或用第三方样式时,若直接拼接 ?page=2,会丢掉所有筛选参数。必须显式合并当前 query。
- 获取完整分页链接前缀:
$prefix = url('index/list', $filter); // 注意:url() 第二个参数是 GET 参数数组 - 不要手动拼
$prefix . '?page=' . $i,ThinkPHP 的url()会自动处理已有参数去重 - 如果用了
Url::build(),确保传入的参数数组包含全部筛选项,否则旧参数会被清空
最稳妥的方式始终是让框架生成链接——哪怕自定义样式,也从 $list->render() 输出的 HTML 中提取逻辑,或使用 $list->getUrlRange(1, 5) 获取带全参数的 URL 数组。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











