145 votes

Les liens de la pagination de Laravel n'incluent pas les autres paramètres GET

J'utilise Eloquent avec la classe Pagination de Laravel 4.

Problème : Lorsqu'il y a des paramètres GET dans l'URL, par exemple : http://site.com/users?gender=female&body=hot les liens de pagination produits ne contiennent que le page et rien d'autre.

Modèle de lame

{{ $users->link() }}

Il y a un ->append() pour cela, mais lorsque nous ne savons pas combien de paramètres GET il y a, comment utiliser la fonction append() d'inclure les autres paramètres GET dans les liens paginés sans tout un morceau de if qui perturbe notre modèle de lame ?

141voto

Alexandre Danault Points 3443

EDIT : Le commentaire de Connor et la réponse de Mehdi sont nécessaires pour que cela fonctionne. Merci aux deux pour leurs clarifications.

->appends() peut accepter un tableau comme paramètre, vous pourriez passer Input::except('page') cela devrait faire l'affaire.

Ejemplo:

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

138voto

Hassan Azimi Points 4494

Je pense que vous devriez utiliser ce code dans la version 5+ de Laravel. De plus, cela ne fonctionnera pas seulement avec le paramètre page mais aussi avec tout autre paramètre :

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

Personnellement, j'essaie d'éviter d'utiliser Facades autant que je le peux. L'utilisation de fonctions d'aide globales permet de réduire le code et d'être plus élégant.

UPDATE :

Ne pas utiliser Input Facade, car il est déprécié dans Laravel v6+.

68voto

Vous pourriez utiliser

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

Exemple dans le contrôleur :

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

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

Exemple dans la vue :

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

41voto

Mehdi Maghrooni Points 489

Soyez conscient de la Input::all() il inclura l'ancien ?page= valeurs encore et encore dans chaque page que vous ouvrez !
par exemple si vous êtes dans ?page=1 et que vous ouvrez la page suivante, cela ouvrira ?page=1&page=2
Ainsi, la dernière valeur prise par la page sera la page que vous voyez ! et non la page que vous voulez voir.

Solution : utilisez Input::except(array('page'))

32voto

Rikesh Shrestha Points 420

Laravel 7.x et plus a ajouté une nouvelle méthode au paginateur :

->withQueryString()

Donc vous pouvez l'utiliser comme :

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

Pour les versions de Laravel inférieures à 7.x, utilisez :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X