Enlaces de paginación de Laravel que no incluyen otros parámetros GET

102

Estoy usando Eloquent junto con la clase de paginación de Laravel 4.

Problema: cuando hay algunos parámetros GET en la URL, por ejemplo:, http://site.com/users?gender=female&body=hotlos enlaces de paginación producidos solo contienen el pageparámetro y nada más.

Plantilla de hoja

{{ $users->link() }}

Hay una ->append()función para esto, pero cuando no sabemos cuántos de los parámetros GET hay, ¿cómo podemos usar append()para incluir los otros parámetros GET en los enlaces paginados sin que una gran cantidad de ifcódigo estropee nuestra plantilla blade?

Nyxynyx
fuente

Respuestas:

121

EDITAR: Se requiere el comentario de Connor con la respuesta de Mehdi para que esto funcione. Gracias a ambos por sus aclaraciones.

->appends()puede aceptar una matriz como parámetro, podría pasar Input::except('page'), eso debería funcionar.

Ejemplo:

return view('manage/users', [
    'users' => $users->appends(Input::except('page'))
]);
Alexandre Danault
fuente
37
Solo para tener en cuenta para otros Googlers que vienen de esta manera, ahora es plural appends, no append . El encadenamiento correcto sería algo así como$query->appends($foo)->links();
Connor Peet
6
Descubrí que $query->appends(Input::except('page'))->links();funcionaba mejor. De lo contrario, la variable de página no se actualizó al hacer clic en una página. Laravel 4.1.24.
bitlather
... y luego me desplacé hacia abajo para ver la solución de Mehdi.
bitlather
2
LARAVEL 5: {!! $myItems->appends(Input::except('page'))->render() !!}
ecairol
2
En laravel 5.2, debe usar Solicitud en lugar de Entrada
Christophvh
104

Creo que deberías usar este código en Laravel 5. Además, esto funcionará no solo con el parámetro pagesino también con cualquier otro parámetro (s):

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

Personalmente, trato de evitar usar Facadestanto como puedo. El uso de funciones auxiliares globales es menos código y mucho más elegante.

ACTUALIZAR:

No use InputFacade ya que está obsoleto en Laravel v6 +

Hassan Azimi
fuente
2
Esto funcionó para laravel 5.6, usar la solución de respuesta aceptada me causó un error.
Muhmmad Aziz
1
También implementé esto con éxito en un proyecto 5.3; También prefiero este método simple
kjones
3
Además, he notado que no es necesario utilizar except('page')esta solución.
BakerStreetSystems
1
Muy útil. Gracias
Viraj Amarasinghe
40

Tenga en cuenta de la Input::all(), incluirá los anteriores ?page=valores y otra vez en cada página se abre!
por ejemplo, si está dentro ?page=1y abre la página siguiente, se abrirá. ¡ ?page=1&page=2
Así que el último valor que tome la página será la página que vea! no es la página que quieres ver

Solución: use Input::except(array('page'))

Mehdi Maghrouni
fuente
39

Podrías usar

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

Ejemplo en el controlador:

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

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

Ejemplo en la vista:

{{ $users->appends(request()->query())->links() }}
Aleksandr Kopelevich
fuente
3
Esta es la forma sugerida por Mohamed Said (empleado de Laravel), ver: github.com/laravel/framework/issues/…
Roy
1
Creo que esta es la mejor respuesta por lo que dijo @roy + mejores ejemplos. También tiene el ejemplo en Controller + View example.
Maky
2
Trabajó para mi. +1
Manoj Kumar
1
Esta es la mejor solución, esto también funcionó para mí
Jithin
28

No append()pero appends() así, la respuesta correcta es:

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

LARAVEL 5

La vista debe contener algo como:

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

ecairol
fuente
5

Utilice esta construcción para mantener todos los parámetros de entrada excepto la página

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

¿Por qué?

1) quitas todo lo que agregó para pedir así

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

2) no necesita $ request como parámetro de entrada para la función

3) estás excluyendo "página"

PS) y funciona para Laravel 5.1

Yevgeniy Afanasyev
fuente
4

Incluya esto en su página de vista

 $users->appends(Input::except('page'))
Siva Ganesh
fuente
4

para quien uno en laravel 5 o mayor en blade:

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

puedes obtener el artículo pasado con

$passed_item=$request->id;

pruébalo con

dd($passed_item);

debes obtener $ algo de valor

Mostafa Asadi
fuente
1

Laravel 7.x ha agregado un nuevo método al paginador:

->withQueryString()

Entonces puedes usarlo como:

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

Para laravel por debajo de 7.x use:

{{ $users->appends(request()->query())->links() }}
Rikesh Shrestha
fuente
0

Pase también el número de página para la paginación. Algo como esto

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

Cengkuru Michael
fuente