Linki Laravel Pagination nie zawierają innych parametrów GET

102

Używam Eloquent razem z klasą Pagination Laravel 4.

Problem: Jeśli w adresie URL znajdują się parametry GET, np .: http://site.com/users?gender=female&body=hot, utworzone łącza do stronicowania zawierają tylko pageparametr i nic więcej.

Szablon ostrza

{{ $users->link() }}

Jest ->append()do tego funkcja, ale jeśli nie wiemy, ile jest parametrów GET, jak możemy użyć append()innych parametrów GET w linkach podzielonych na strony bez całego kawałka ifkodu psującego nasz szablon blade?

Nyxynyx
źródło

Odpowiedzi:

121

EDYCJA: komentarz Connora z odpowiedzią Mehdiego jest wymagany, aby to zadziałało. Dziękuję obojgu za wyjaśnienia.

->appends()może przyjąć tablicę jako parametr, który możesz przekazać Input::except('page'), to powinno załatwić sprawę.

Przykład:

return view('manage/users', [
    'users' => $users->appends(Input::except('page'))
]);
Alexandre Danault
źródło
37
Zwróć uwagę na innych pracowników Google, którzy przychodzą w ten sposób - teraz jest w liczbie mnogiej appends, nie append . Prawidłowy łańcuch byłby podobny do$query->appends($foo)->links();
Connor Peet
6
Okazało się, że $query->appends(Input::except('page'))->links();działa lepiej. W przeciwnym razie zmienna strony nie aktualizowała się po kliknięciu strony. Laravel 4.1.24.
bitlather
... a potem przewinęłam w dół, żeby zobaczyć rozwiązanie Mehdiego.
bitlather
2
LARAVEL 5: {!! $myItems->appends(Input::except('page'))->render() !!}
ecairol
2
W laravel 5.2 powinieneś użyć Request zamiast Input
Christophvh
104

Myślę, że powinieneś użyć tego kodu w Laravel 5. Również to zadziała nie tylko z parametrem, pageale także z innymi parametrami:

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

Osobiście staram się unikać używania Facadesjak najwięcej. Korzystanie z globalnych funkcji pomocniczych jest mniej kodowe i bardziej eleganckie.

AKTUALIZACJA:

Nie używaj InputFasady, ponieważ jest przestarzała w Laravel v6 +

Hassan Azimi
źródło
2
To zadziałało w laravel 5.6, użycie zaakceptowanego rozwiązania odpowiedzi spowodowało błąd.
Muhmmad Aziz
1
Wdrożyłem to również z powodzeniem w projekcie 5.3; Wolę również tę prostą metodę
kjones
3
Zauważyłem również, że nie musisz używać except('page')tego rozwiązania.
BakerStreetSystems
1
Bardzo pomocne. Dzięki
Viraj Amarasinghe
40

Należy pamiętać o tym Input::all(), że będzie on zawierał poprzednie ?page=wartości na każdej otwartej stronie!
na przykład, jeśli jesteś w ?page=1i otworzysz następną stronę, otworzy się ?page=1&page=2
Więc ostatnia strona wartości będzie stroną, którą widzisz! nie stronę, którą chcesz zobaczyć

Rozwiązanie: użyj Input::except(array('page'))

Mehdi Maghrouni
źródło
39

Możesz użyć

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

Przykład w kontrolerze:

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

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

Przykład w widoku:

{{ $users->appends(request()->query())->links() }}
Aleksandr Kopelevich
źródło
3
Tak sugeruje Mohamed Said (pracownik Laravel), patrz: github.com/laravel/framework/issues/…
Roy
1
Myślę, że to najlepsza odpowiedź ze względu na to, co powiedział @roy + lepsze przykłady. Ma również przykład kontrolera + Zobacz przykład.
Maky
2
Pracował dla mnie. +1
Manoj Kumar
1
To najlepsze rozwiązanie, to też zadziałało
Jithin
28

Nie, append()ale appends() prawidłowa odpowiedź brzmi:

{!! $records->appends(Input::except('page'))->links() !!}
Łysy
źródło
11

LARAVEL 5

Widok musi zawierać coś takiego:

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

ecairol
źródło
5

Użyj tej konstrukcji, aby zachować wszystkie parametry wejściowe oprócz strony

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

Czemu?

1) usuwasz wszystko, co dodało do takiej prośby

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

2) nie potrzebujesz $ request jako parametru wejściowego dla funkcji

3) wykluczasz „stronę”

PS) i działa z Laravel 5.1

Yevgeniy Afanasyev
źródło
4

Uwzględnij to na swojej stronie widoku

 $users->appends(Input::except('page'))
Siva Ganesh
źródło
4

dla kogo w laravel 5 lub większej w ostrzu:

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

możesz otrzymać przekazany przedmiot za pomocą

$passed_item=$request->id;

przetestuj to z

dd($passed_item);

musisz dostać $ coś wartościowego

Mostafa Asadi
źródło
1

Laravel 7.x dodał nową metodę do paginatora:

->withQueryString()

Możesz więc używać go tak:

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

Dla laravel poniżej 7.x użyj:

{{ $users->appends(request()->query())->links() }}
Rikesh Shrestha
źródło
0

Przekaż również numer strony do paginacji. Coś takiego

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

Cengkuru Michael
źródło