
在 Laravel 中使用 $users->links() 进行分页时,原始 URL 中的查询参数(如 ?country=india&state=haryana)默认会被丢弃,导致翻页后仅剩 ?page=2。解决方案是调用 withQueryString() 方法显式保留所有非分页相关参数。
在 laravel 中使用 `$users->links()` 进行分页时,原始 url 中的查询参数(如 `?country=india&state=haryana`)默认会被丢弃,导致翻页后仅剩 `?page=2`。解决方案是调用 `withquerystring()` 方法显式保留所有非分页相关参数。
当通过 URL 查询参数(例如 ?country=india&state=haryana)对用户列表进行动态筛选,并结合 Laravel 的 Eloquent 分页器(如 $users = User::where(...)->paginate(15))时,直接调用 {{ $users->links() }} 渲染分页链接会导致除 page 外的所有参数丢失——这是 Laravel 分页器的默认行为,旨在避免污染分页上下文。
✅ 推荐解决方案:使用 withQueryString()
自 Laravel 7.x 起,分页器提供了链式方法 withQueryString(),它会自动将当前请求中除 page 外的所有查询参数注入到分页链接中:
<!-- 在 Blade 模板中 -->
{{ $users->withQueryString()->links() }}该方法智能识别并保留 country、state、search、sort 等自定义参数,生成类似以下的链接:
<a href="?country=india&state=haryana&page=2">2</a> <a href="?country=india&state=haryana&page=3">3</a>
⚠️ 注意事项:
- withQueryString() 仅适用于 Laravel ≥ 7.0;若使用旧版本(如 6.x),需手动传递参数,例如:
{{ $users->appends(request()->except('page'))->links() }}但此方式需确保 request()->except('page') 返回的是可序列化的关联数组(Laravel 6+ 兼容)。
- 若存在敏感参数(如 token、signature),建议改用 withQueryParams($array)(Laravel 10.28+ 新增)进行白名单控制:
{{ $users->withQueryParams(['country', 'state', 'search'])->links() }} - withQueryString() 不影响分页逻辑本身,仅修改链接渲染行为,底层数据查询与 paginate() 调用完全解耦。
? 总结:
对于绝大多数现代 Laravel 项目(7.x 及以上),->withQueryString()->links() 是简洁、安全、符合框架设计哲学的标准做法。它无需额外逻辑、不侵入控制器、不重复构造 URL,是解决“分页丢失筛选参数”问题的首选方案。

















