Links de paginação do Laravel não incluindo outros parâmetros GET

102

Estou usando o Eloquent junto com a classe de paginação do Laravel 4.

Problema: quando existem alguns parâmetros GET na URL, por exemplo http://site.com/users?gender=female&body=hot:, os links de paginação produzidos contêm apenas o pageparâmetro e nada mais.

Modelo de lâmina

{{ $users->link() }}

Há uma ->append()função para isso, mas quando não sabemos quantos parâmetros GET existem, como podemos usar append()para incluir os outros parâmetros GET nos links paginados sem que um pedaço inteiro de ifcódigo atrapalhe nosso modelo blade?

Nyxynyx
fonte

Respostas:

121

EDIT: O comentário de Connor com a resposta de Mehdi são necessários para fazer este trabalho. Obrigado a ambos pelos esclarecimentos.

->appends()pode aceitar um array como parâmetro, você pode passar Input::except('page'), isso deve resolver o problema.

Exemplo:

return view('manage/users', [
    'users' => $users->appends(Input::except('page'))
]);
Alexandre Danault
fonte
37
Apenas para observar outros Googlers que vêm para cá - agora é plural appends, não append . O encadeamento correto seria algo como$query->appends($foo)->links();
Connor Peet
6
Achei que $query->appends(Input::except('page'))->links();funcionou melhor. Caso contrário, a variável da página não foi atualizada quando você clicou em uma página. Laravel 4.1.24.
bitlather
... e então rolei para baixo para ver a solução de Mehdi.
bitlather
2
LARAVEL 5: {!! $myItems->appends(Input::except('page'))->render() !!}
ecairol
2
No laravel 5.2 você deve usar Solicitação em vez de Entrada
Christophvh
104

Acho que você deve usar este código no Laravel 5. Além disso, isso funcionará não apenas com o parâmetro, pagemas também com qualquer outro parâmetro (s):

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

Pessoalmente, tento evitar usar Facadeso máximo que posso. Usar funções auxiliares globais é menos código e muito elegante.

ATUALIZAR:

Não use o InputFaçade, pois ele está obsoleto no Laravel v6 +

Hassan Azimi
fonte
2
Isso funcionou para o laravel 5.6, usar a solução de resposta aceita causou um erro para mim.
Muhmmad Aziz
1
Eu também implementei isso com sucesso em um projeto 5.3; Eu também prefiro este método simples
kjones de
3
Além disso, percebi que você não precisa usar except('page')com esta solução.
BakerStreetSystems
1
Muito útil. Obrigado
Viraj Amarasinghe
40

Esteja ciente de que Input::all()ele incluirá os ?page=valores anteriores repetidamente em cada página que você abrir!
por exemplo, se você estiver em ?page=1e abrir a próxima página, ela será aberta. ?page=1&page=2
Portanto, o último valor que a página terá será a página que você vê! não a página que você quer ver

Solução: use Input::except(array('page'))

Mehdi Maghrouni
fonte
39

Você poderia usar

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

Exemplo no controlador:

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

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

Exemplo na visualização:

{{ $users->appends(request()->query())->links() }}
Aleksandr Kopelevich
fonte
3
Esta é a forma sugerida por Mohamed Said (funcionário do Laravel), consulte: github.com/laravel/framework/issues/…
Roy
1
Acho que essa é a melhor resposta por causa do que disse @roy + exemplos melhores. Também tem o exemplo em Controller + View example.
Maky
2
Funcionou para mim. +1
Manoj Kumar
1
Esta é a melhor solução, funcionou para mim também
Jithin
28

Não, append()mas appends() então, a resposta certa é:

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

LARAVEL 5

A visualização deve conter algo como:

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

ecairol
fonte
5

Use esta construção, para manter todos os parâmetros de entrada, exceto a página

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

Por quê?

1) você retira tudo o que adicionou a uma solicitação como essa

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

2) você não precisa de $ request como parâmetro de entrada para a função

3) você está excluindo "página"

PS) e funciona para o Laravel 5.1

Yevgeniy Afanasyev
fonte
4

Incluir na sua página de visualização

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

para quem em laravel 5 ou maior em lâmina:

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

você pode obter o item aprovado com

$passed_item=$request->id;

teste com

dd($passed_item);

você deve obter o valor de $ alguma coisa

Mostafa Asadi
fonte
1

Laravel 7.x adicionou um novo método ao paginador:

->withQueryString()

Então você pode usá-lo como:

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

Para laravel abaixo de 7.x, use:

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

Passe o número da página para paginação também. Algo assim

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

Cengkuru Michael
fonte