
Laravel 默认分页会丢失原始 URL 中的查询参数(如 ?country=india&state=haryana),导致翻页后筛选条件失效;从 Laravel 7 起,可通过 withQueryString() 方法轻松保留所有非分页相关的查询参数。
laravel 默认分页会丢失原始 url 中的查询参数(如 ?country=india&state=haryana),导致翻页后筛选条件失效;从 laravel 7 起,可通过 `withquerystring()` 方法轻松保留所有非分页相关的查询参数。
在使用 Laravel 的 Eloquent 分页时,$users->links() 渲染的分页链接默认仅保留 page 参数,而忽略其他自定义查询参数(例如 country、state、search 等)。这会导致用户在筛选数据后点击“下一页”时,筛选条件意外丢失,体验中断。
✅ 正确解决方案是调用分页器实例的 withQueryString() 方法:
{{-- 在 Blade 模板中 --}}
{{ $users->withQueryString()->links() }}该方法会自动将当前请求中除 page 外的所有查询参数(如 ?country=india&state=haryana)透传至每一页的分页链接中,生成类似:
abc.com?country=india&state=haryana&page=2 abc.com?country=india&state=haryana&page=3
⚠️ 注意事项:
- withQueryString() 自 Laravel 7.0 起引入,不兼容 Laravel 6.x 或更早版本。若使用旧版本,请升级 Laravel 或手动构造分页器(如通过 appends());
- 它会智能排除 page 参数以避免冲突,无需额外处理;
- 若需有选择地保留部分参数(例如只保留 search,忽略 sort_by),可改用 appends() 显式指定:
{{ $users->appends(['search' => request('search')])->links() }}? 进阶提示:结合 request()->query() 可实现全量安全透传(适用于 Laravel ≥ 8.x):
{{ $users->withQueryString()->links() }}或在控制器中统一处理(推荐用于复杂场景):
// Controller
$users = User::where('country', request('country'))
->when(request('state'), fn($q) => $q->where('state', request('state')))
->paginate(15);最终,withQueryString() 是 Laravel 提供的简洁、健壮且符合 RESTful 设计原则的标准方案——无需重写分页视图,无需手动拼接 URL,一行代码即可解决筛选态分页的常见痛点。

















