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.