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?

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'))
]);

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 +


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'))


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() }}

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() !!}

11

LARAVEL 5

La vue doit contenir quelque chose comme:

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


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


4

Inclure ceci dans votre page d'affichage

 $users->appends(Input::except('page'))

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


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() }}

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); });

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.