Liens de pagination Laravel n'incluant pas d'autres paramètres GET

102

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 pageparamètre et rien d'autre.

Modèle de lame

{{ $users->link() }}

Il y a une ->append()fonction pour cela, mais quand nous ne savons pas combien de paramètres GET y a-t-il, comment pouvons-nous utiliser append()pour inclure les autres paramètres GET dans les liens paginés sans que tout un morceau de ifcode ne gâche notre modèle de lame?

Nyxynyx
la source

Réponses:

121

EDIT: Le commentaire de Connor avec la réponse de Mehdi est nécessaire pour que cela fonctionne. Merci à tous les deux pour leurs clarifications.

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

Exemple:

return view('manage/users', [
    'users' => $users->appends(Input::except('page'))
]);
Alexandre Danault
la source
37
Juste à noter pour les autres Googleurs venant de cette façon - c'est maintenant au pluriel appends, non append . Le chaînage correct serait quelque chose comme$query->appends($foo)->links();
Connor Peet
6
J'ai trouvé que cela $query->appends(Input::except('page'))->links();fonctionnait mieux. Sinon, la variable de page ne s'est pas mise à jour lorsque vous avez cliqué sur une page. Laravel 4.1.24.
bitlather
... puis j'ai fait défiler vers le bas pour voir la solution de Mehdi.
bitlather
2
LARAVEL 5: {!! $myItems->appends(Input::except('page'))->render() !!}
ecairol
2
Dans laravel 5.2, vous devriez utiliser Request au lieu de Input
Christophvh
104

Je pense que vous devriez utiliser ce code dans Laravel 5. De plus, cela fonctionnera non seulement avec le paramètre, pagemais aussi avec tout autre paramètre:

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

Personnellement, j'essaie d'éviter d'en utiliser Facadesautant que je peux. L'utilisation des fonctions d'assistance globales est moins de code et beaucoup plus élégante.

METTRE À JOUR:

N'utilisez pas InputFacade car il est obsolète dans Laravel v6 +

Hassan Azimi
la source
2
Cela a fonctionné pour laravel 5.6, l'utilisation de la solution de réponse acceptée a provoqué une erreur pour moi.
Muhmmad Aziz
1
J'ai également mis en œuvre cela avec succès sur un projet 5.3; Je préfère aussi cette méthode simple
kjones
3
De plus, j'ai remarqué que vous n'avez pas besoin d'utiliser except('page')cette solution.
BakerStreetSystems
1
Très utile. Merci
Viraj Amarasinghe
40

Soyez conscient du Input::all(), il inclura les ?page=valeurs précédentes encore et encore dans chaque page que vous ouvrez!
par exemple, si vous êtes ?page=1et que vous ouvrez la page suivante, elle s'ouvrira. ?page=1&page=2
Ainsi, la dernière page de valeur prise sera la page que vous voyez! pas la page que vous voulez voir

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

Mehdi Maghrouni
la source
39

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() }}
Aleksandr Kopelevich
la source
3
C'est la voie suggérée par Mohamed Said (employé de Laravel), voir: github.com/laravel/framework/issues
Roy
1
Je pense que c'est la meilleure réponse à cause de ce que @roy a dit + de meilleurs exemples. Il contient également l'exemple dans Controller + View.
Maky
2
A travaillé pour moi. +1
Manoj Kumar
1
C'est la meilleure solution, cela a fonctionné pour moi aussi
Jithin
28

Pas append()mais appends() donc, la bonne réponse est:

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

LARAVEL 5

La vue doit contenir quelque chose comme:

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

écairol
la source
5

Utilisez cette construction, pour conserver tous les paramètres d'entrée sauf la page

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

Pourquoi?

1) vous supprimez tout ce qui a ajouté à la demande comme ça

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

2) vous n'avez pas besoin de $ request comme paramètre d'entrée pour la fonction

3) vous excluez "page"

PS) et cela fonctionne pour Laravel 5.1

Yevgeniy Afanasyev
la source
4

Inclure ceci dans votre page d'affichage

 $users->appends(Input::except('page'))
Siva Ganesh
la source
4

pour qui un en laravel 5 ou plus en lame:

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

vous pouvez obtenir l'article passé avec

$passed_item=$request->id;

tester avec

dd($passed_item);

vous devez obtenir une valeur de $ quelque chose

Mostafa Asadi
la source
1

Laravel 7.x a ajouté une nouvelle méthode à paginator:

->withQueryString()

Vous pouvez donc l'utiliser comme:

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

Pour laravel en dessous de 7.x utiliser:

{{ $users->appends(request()->query())->links() }}
Rikesh Shrestha
la source
0

Transmettez également le numéro de page pour la pagination. Quelque chose comme ça

$currentPg = Input::get('page') ? Input::get('page') : '1';
    $boards = Cache::remember('boards'.$currentPg, 60, function(){ return WhatEverModel::paginate(15); });

Cengkuru Michael
la source