Laravel分页链接没有包括其他GET参数

160

我正在使用Eloquent和Laravel 4的Pagination类。

问题:当URL中有某些GET参数时,例如:http://site.example/users?gender=female&body=hot,所产生的分页链接只包含page参数,而没有其他任何参数。

Blade模板

{{ $users->link() }}

虽然有一个名为 ->append() 的函数可以实现这个功能,但当我们不知道有多少个 GET 参数时,如何使用 append() 函数在分页链接中包含其他 GET 参数而不需要大量的 if 代码来干扰我们的 Blade 模板呢?


3
在 Laravel 7 及以上版本中,您可以简单地执行以下操作: {{ $users->withQueryString()->links() }} - Ali_Hr
14个回答

159

我认为您应该在 Laravel 5+ 版本中使用此代码。 此代码不仅适用于参数page,也适用于任何其他参数:

$users->appends(request()->input())->links();

个人而言,我尽量避免使用Facades。使用全局帮助函数可以减少代码量并更加优雅。

更新:

不要在Laravel v6+中使用Input Facade,因为它已过时。


2
这适用于laravel 5.6,使用被接受的答案解决方案会导致错误。 - Muhmmad Aziz
1
我也在一个5.3项目上成功地实现了这个功能;我也喜欢这种简单的方法。 - kjones
3
同时,我注意到你不需要在这个解决方案中使用 except('page') - JasonJensenDev
你试图避免哪些全局辅助函数和门面模式? - KorbenDallas
3
这在 Laravel 8 中可行,是一种更实用和简单的解决方案。 - Altaf Hussain
@KorbenDallas RequestInput 门面 - Amir Hassan Azimi

144

编辑:为使此方法生效,需要结合Connor的评论和Mehdi的答案。感谢他们的澄清。

->appends()方法可以接受一个数组作为参数,你可以传递Input::except('page'),这样就能解决问题了。

示例:

return view('manage/users', [
    'users' => $users->appends(Input::except('page'))
]);

39
提醒其他通过谷歌搜索到这里的人 - 现在是复数appends,而不是单数append。正确的链接方式应该像这样$query->appends($foo)->links(); - Connor Peet
6
我发现 $query->appends(Input::except('page'))->links(); 更好用。否则在你点击页码时,页面变量不会更新。 Laravel 4.1.24. - bitlather
1
然后我向下滚动查看了Mehdi的解决方案。 - bitlather
2
LARAVEL 5:{!! $myItems->appends(Input::except('page'))->render() !!} - ecairol
2
在 Laravel 5.2 中,您应该使用 Request 而不是 Input。 - Christophvh
显示剩余7条评论

79

你可以使用

->appends(request()->query())

在控制器中的示例:

$users = User::search()->order()->with('type:id,name')
    ->paginate(30)
    ->appends(request()->query());

return view('users.index', compact('users'));

视图中的示例:

{{ $users->appends(request()->query())->links() }}

6
这是Mohamed Said(Laravel员工)建议的方式,请参见:https://github.com/laravel/framework/issues/19441#issuecomment-305526428 - Roy

47

Laravel 7.x及以上版本已添加了新的分页器方法:

->withQueryString()

那么你可以像这样使用它:

{{ $users->withQueryString()->links() }}

对于 Laravel 7.x 以下版本,请使用:

{{ $users->appends(request()->query())->links() }}

2
哇,这只是一行代码,太神奇了。我错过了文档。虽然7.x很棒。 - MR_AMDEV
1
@MR_AMDEV 在幕后,它们两者是相同的。Laravel 只是在其最新版本中采用了它。 - Shrestharikesh
@RikeshShrestha 有没有一种方法可以对查询参数进行urlencode处理? - pimarc
如果您有一个空的参数值,也请使用 if (isset($_GET['search_text'])) { $search_text = $_GET['search_text']; } else { $search_text = "";} - DragonFire
1
这应该是被接受的答案。它为不同版本的Laravel提供了答案。 - Aman
显示剩余2条评论

41
注意 Input::all() 会在每次打开页面时重复包含之前的?page=值!例如,如果你在?page=1中,并打开下一页,它会打开?page=1&page=2 。因此,最后一个页面的值将是你所看到的页面,而不是你想要看到的页面。 解决方案: 使用Input::except(array('page'))

29

不是append()而是appends()。因此正确答案是:

{!! $records->appends(Input::except('page'))->links() !!}

11

LARAVEL 5

视图必须包含以下内容:

{!! $myItems->appends(Input::except('page'))->render() !!}


11
在您的控制器中进行分页后,添加withQueryString(),如下所示。
$post = Post::paginate(10)->withQueryString();

5
使用此结构,保留所有输入参数但不包括页面。
{!! $myItems->appends(Request::capture()->except('page'))->render() !!}

为什么?

1) 您需要去除添加到请求中的所有内容,如下所示:

  $request->request->add(['variable' => 123]);

2) 你不需要将$request作为函数的输入参数

3) 你正在排除 "page"

PS) 这适用于 Laravel 5.1


4

适用于 Laravel 5 或更高版本的用户,在 Blade 模板中:

{{ $table->appends(['id' => $something ])->links() }}

您可以使用以下代码获取已传递的项目:

$passed_item=$request->id;

用以下方式测试

dd($passed_item);

您必须获取$something的值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接