Collegamenti di Paginazione Laravel che non includono altri parametri GET


102

Sto usando Eloquent insieme alla classe Pagination di Laravel 4.

Problema: quando sono presenti alcuni parametri GET nell'URL, ad esempio http://site.com/users?gender=female&body=hot:, i collegamenti di paginazione prodotti contengono solo il pageparametro e nient'altro.

Modello di lama

{{ $users->link() }}

C'è una ->append()funzione per questo, ma quando non sappiamo quanti dei parametri GET ci sono, come possiamo usare append()per includere gli altri parametri GET nei collegamenti impaginati senza che un intero pezzo di ifcodice rovini il nostro modello di blade?

Risposte:


121

EDIT: Il commento di Connor con la risposta di Mehdi sono necessari per far funzionare questo. Grazie ad entrambi per i loro chiarimenti.

->appends()può accettare un array come parametro, potresti passare Input::except('page'), che dovrebbe fare il trucco.

Esempio:

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

37
Solo per notare per gli altri googler che vengono da questa parte: ora è plurale appends, no append . Il concatenamento corretto sarebbe qualcosa del tipo$query->appends($foo)->links();
Connor Peet

6
Ho trovato $query->appends(Input::except('page'))->links();funzionato meglio. In caso contrario, la variabile della pagina non si aggiornava quando si faceva clic su una pagina. Laravel 4.1.24.
bitlather

... e poi ho fatto scorrere verso il basso per vedere la soluzione di Mehdi.
bitlather

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

2
In laravel 5.2 dovresti usare Request invece di Input
Christophvh

104

Penso che dovresti usare questo codice in Laravel 5. Inoltre questo funzionerà non solo con il parametro pagema anche con qualsiasi altro parametro (i):

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

Personalmente, cerco di evitare di usarne Facadesil più possibile. Usare le funzioni di aiuto globali è meno codice ed è molto elegante.

AGGIORNARE:

Non utilizzare InputFacade poiché è deprecato in Laravel v6 +


2
Questo ha funzionato per laravel 5.6, l'utilizzo della soluzione di risposta accettata ha causato un errore per me.
Muhmmad Aziz

1
L'ho anche implementato con successo su un progetto 5.3; Preferisco anche questo semplice metodo
kjones

3
Inoltre, ho notato che non è necessario utilizzare except('page')questa soluzione.
BakerStreetSystems

1
Molto utile. Grazie
Viraj Amarasinghe

40

Essere consapevoli del Input::all(), includerà i precedenti ?page=valori di nuovo e di nuovo in ogni pagina che si apre!
per esempio se sei dentro ?page=1e apri la pagina successiva, si aprirà ?page=1&page=2
Quindi l'ultimo valore che la pagina prende sarà la pagina che vedi! non la pagina che vuoi vedere

Soluzione: utilizzare Input::except(array('page'))


39

Potresti usare

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

Esempio nel controller:

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

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

Esempio nella vista:

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

3
Questo è il modo suggerito da Mohamed Said (impiegato Laravel), vedere: github.com/laravel/framework/issues/…
Roy

1
Penso che questa sia la risposta migliore per quello che ha detto @roy + esempi migliori. Inoltre ha l'esempio del controller + Visualizza esempio.
Maky

2
Ha funzionato per me. +1
Manoj Kumar

1
Questa è la soluzione migliore, ha funzionato anche per me
Jithin

28

Non append()ma appends() così, la risposta giusta è:

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

11

LARAVEL 5

La vista deve contenere qualcosa come:

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


5

Usa questa costruzione, per mantenere tutti i parametri di input tranne la pagina

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

Perché?

1) elimini tutto ciò che è stato aggiunto per richiedere quel tipo

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

2) non è necessario $ request come parametro di input per la funzione

3) stai escludendo "pagina"

PS) e funziona per Laravel 5.1


4

Includilo nella tua pagina di visualizzazione

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

4

per chi in laravel 5 o superiore in lama:

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

puoi ottenere l'elemento passato con

$passed_item=$request->id;

provalo con

dd($passed_item);

devi ottenere $ qualcosa di valore


1

Laravel 7.x ha aggiunto un nuovo metodo a paginator:

->withQueryString()

Quindi puoi usarlo come:

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

Per laravel inferiori a 7.x utilizzare:

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

0

Passa anche il numero di pagina per l'impaginazione. Qualcosa come questo

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.