分页后搜索条件消失是因为未在 paginate() 中通过 query 参数显式传递当前搜索参数;需用 array_diff_key(request()->param(), ['page' => '', 'p' => '']) 过滤并传入 query,且参数名须与 url 实际一致。

分页后搜索条件消失,不是框架有问题,是你没在 paginate() 里告诉它“哪些参数要带上”。
paginate() 的 query 参数必须显式传,不能依赖自动携带
ThinkPHP 不会默认把当前 URL 的所有 GET 参数塞进分页链接。比如访问 ?keyword=php&type=blog&page=2,点下一页变成 ?page=3,keyword 和 type 全丢——这就是漏了 query 配置。
-
query是个数组,键是参数名,值是对应值,例如['keyword' => $keyword, 'type' => $type] - 最常用写法是
request()->param(),但它会把page也包进去;而paginate()自己管page,重复会导致翻页错乱 - 推荐过滤掉分页相关键:
array_diff_key(request()->param(), ['page' => '', 'p' => '']) - 如果用了自定义页码参数(如
'var_page' => 'p'),取当前页码得用input($config['var_page'] ?? 'page'),别硬写input('page')
别在模板里滥用 appends() 补救
$list->appends(['keyword' => $keyword]) 确实能临时加参数,但它只影响当次 render() 输出,且容易和控制器里的 query 冲突。
- 一旦控制器已配
query,再在模板里用appends(),参数会被叠加两次 - 只在简单场景(单个固定参数)且控制器没配
query时才考虑用 - 不要在循环里反复调用
appends(),它每次返回新对象,徒增内存开销 - 用
simple()模式时appends()仍有效,但不会改原始分页对象的 URL 基础
别把 Paginator 对象转成数组再传给模板
有人为了图方便,在控制器里写了 $list = $list->toArray() 或 json($list) 再传给模板,结果 {$list->render()} 报错或输出空字符串。
-
render()必须作用于原始的Paginator对象,转成数组就只剩数据,没了分页元信息(总页数、当前页、URL 生成逻辑等) - 模板中需要渲染分页栏,就得保持变量是
Paginator实例,别提前解构 - 若需额外加工数据,建议用
$list->items()取出数据数组,保留原对象用于render()
最易被忽略的一点:如果你设了 'var_page' => 'p',又在 query 里写 ['page' => input('page')],而实际 URL 是 ?p=2,那 input('page') 就拿不到值——参数名必须和真实 URL 中的一致,和 var_page 配置无关。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











