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?

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

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 +


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


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

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

11

LARAVEL 5

Widok musi zawierać coś takiego:

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


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



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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.