分页后搜索条件丢失是因 paginate() 默认不保留 url 参数,需显式传入 query 参数(如 request()->param())或使用 withquery() 处理嵌套参数,避免用 appends() 处理动态搜索条件,并确保 paginate() 在查询构造器未执行前调用且模板中 render|raw 输出。

分页后搜索条件消失,不是框架出错,是它默认不保留 URL 参数。只要在调用 paginate() 时显式传入当前查询参数,就能稳稳留住 keyword、status、filter 等所有筛选条件。
用 query 配置一次性透传全部参数
这是兼容性最好、最推荐的写法,适用于 TP5 和所有 TP6 版本。
- 控制器中直接传
request()->param(),它会自动过滤掉page,避免冲突 - 正确示例:
User::where($map)->paginate(['list_rows' => 15, 'query' => request()->param()]) - 若只传部分参数(如仅 keyword 和 category),手动构造数组:
['keyword' => input('keyword'), 'category' => input('category')] - 伪静态路由下,参数仍以
?keyword=xxx&page=2形式拼在链接末尾,不影响接收
TP6.0.12+ 用 withQuery 处理嵌套数组参数
当 URL 中有 filter[status]=1 或 sort[by]=name&sort[dir]=desc 这类带方括号的结构化参数时,appends() 会丢语义,withQuery() 才是正解。
- 直接传
$_GET或request()->param()即可:$list->withQuery(request()->param()) - 它自动剔除
page、保留键名结构、处理 URL 编码,比手写 flatten 函数更可靠 - 必须在
assign()前调用,且不能和appends()混用 - 低版本 TP6 不支持,升级到 6.0.12+ 后优先使用这个
慎用 appends():适合固定参数,不适合动态搜索
它轻量简单,但一碰复杂场景就容易翻车。
- 适合加
site_id=3、lang=zh-cn这类不变的业务标识 - 传数组时若含嵌套(如
['filter' => ['status' => 1]]),生成的链接是?filter[status]=1,但后端可能收不到 - 和
query配置同时存在时,同名键会被appends()覆盖——这点常被忽略 - 别在模板里连写
{$list->appends()->appends()->render()},会重复拼参
排查分页失效的三个关键点
参数加进去了,但翻页后还是没效果?先检查这些硬性前提。
-
paginate() 必须作用于未执行的查询构造器:不能在
select()、all()或toArray()之后调用,否则是“假分页” -
变量不能被提前转换:控制器中
$list = User::paginate(10)是对的,$list = User::paginate(10)->toArray()就丢了分页对象 -
模板渲染要带 |raw:TP6 中必须写
{$list->render|raw},否则 HTML 被转义成纯文本,看起来就是空的
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











