Laravel-Paginierungslinks ohne andere GET-Parameter


102

Ich benutze Eloquent zusammen mit der Paginierungsklasse von Laravel 4.

Problem: Wenn die URL einige GET-Parameter enthält, z. B.: http://site.com/users?gender=female&body=hotEnthalten die erzeugten Paginierungslinks nur den pageParameter und sonst nichts.

Klingenvorlage

{{ $users->link() }}

Es gibt eine ->append()Funktion dafür, aber wenn wir nicht wissen, wie viele der GET-Parameter vorhanden sind, wie können wir append()dann die anderen GET-Parameter in die paginierten Links aufnehmen, ohne dass ein ganzer Teil des ifCodes unsere Blade-Vorlage durcheinander bringt?

Antworten:


121

EDIT: Connors Kommentar mit Mehdis Antwort ist erforderlich, damit dies funktioniert. Vielen Dank an beide für ihre Klarstellungen.

->appends()kann ein Array als Parameter akzeptieren, Sie könnten übergeben Input::except('page'), das sollte den Trick tun.

Beispiel:

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

37
Nur um zu beachten, dass andere Googler auf diese Weise kommen - es ist jetzt Plural appends, nicht mehr append . Die richtige Verkettung wäre so etwas wie$query->appends($foo)->links();
Connor Peet

6
Ich fand es $query->appends(Input::except('page'))->links();besser funktioniert. Andernfalls wurde die Seitenvariable beim Klicken auf eine Seite nicht aktualisiert. Laravel 4.1.24.
Bitlather

... und dann habe ich nach unten gescrollt, um Mehdis Lösung zu sehen.
Bitlather

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

2
In Laravel 5.2 sollten Sie Request anstelle von Input
Christophvh

104

Ich denke, Sie sollten diesen Code in Laravel 5 verwenden. Auch dies funktioniert nicht nur mit Parametern, pagesondern auch mit allen anderen Parametern:

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

Persönlich versuche ich zu vermeiden, Facadesso viel wie möglich zu verwenden. Die Verwendung globaler Hilfsfunktionen ist weniger Code und sehr elegant.

AKTUALISIEREN:

Verwenden Sie InputFacade nicht, da es in Laravel v6 + veraltet ist


2
Dies funktionierte für Laravel 5.6. Die Verwendung der akzeptierten Antwortlösung verursachte einen Fehler für mich.
Muhmmad Aziz

1
Ich habe dies auch erfolgreich in einem 5.3-Projekt implementiert. Ich bevorzuge auch diese einfache Methode
kjones

3
Außerdem habe ich festgestellt, dass Sie except('page')diese Lösung nicht verwenden müssen .
BakerStreetSystems

1
Sehr hilfreich. Vielen Dank
Viraj Amarasinghe

40

Seien Sie sich bewusst von der Input::all(), werden die vorherigen Fügen ?page=Werte immer wieder in jeder Seite , die Sie öffnen!
Wenn Sie beispielsweise in sind ?page=1und die nächste Seite öffnen, wird sie geöffnet. ?page=1&page=2
Die letzte Werteseite ist also die Seite, die Sie sehen! nicht die Seite, die Sie sehen möchten

Lösung: verwenden Input::except(array('page'))


39

Du könntest benutzen

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

Beispiel in der Steuerung:

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

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

Beispiel in der Ansicht:

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

3
Dies ist der von Mohamed Said (Laravel-Mitarbeiter) vorgeschlagene Weg, siehe: github.com/laravel/framework/issues/…
Roy

1
Ich denke, dies ist die beste Antwort aufgrund dessen, was @roy gesagt hat + bessere Beispiele. Es hat auch das Beispiel in Controller + View.
Maky

2
Hat für mich gearbeitet. +1
Manoj Kumar

1
Dies ist die beste Lösung, dies hat auch für mich
funktioniert

28

Nicht append()aber appends() Also, die richtige Antwort lautet:

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

11

LARAVEL 5

Die Ansicht muss Folgendes enthalten:

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


5

Verwenden Sie diese Konstruktion, um alle Eingabeparameter außer Seite beizubehalten

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

Warum?

1) Sie entfernen alles, was zur Anfrage hinzugefügt wurde

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

2) Sie benötigen $ request nicht als Eingabeparameter für die Funktion

3) Sie schließen "Seite" aus

PS) und es funktioniert für Laravel 5.1


4

Fügen Sie dies in Ihre Ansichtsseite ein

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

4

für wen man in Laravel 5 oder höher in Klinge:

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

Sie können den übergebenen Artikel mit erhalten

$passed_item=$request->id;

teste es mit

dd($passed_item);

Sie müssen $ etwas Wert bekommen


1

Laravel 7.x hat dem Paginator eine neue Methode hinzugefügt:

->withQueryString()

Sie können es also wie folgt verwenden:

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

Für Laravel unter 7.x verwenden Sie:

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

0

Übergeben Sie die Seitenzahl auch zur Paginierung. Etwas wie das

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.