Ссылки на страницы Laravel, не включающие другие параметры GET

105

Я использую Eloquent вместе с классом Pagination в Laravel 4.

Проблема: когда в URL-адресе есть некоторые параметры GET, например:, http://site.com/users?gender=female&body=hotсозданные ссылки для разбивки на страницы содержат только pageпараметр и ничего больше.

Шаблон Blade

{{ $users->link() }}

Для этого есть ->append()функция, но если мы не знаем, сколько здесь параметров GET, как мы можем использовать append()для включения других параметров GET в ссылки с разбивкой на страницы, чтобы целый кусок ifкода не испортил наш шаблон лезвия?

Никсиникс
источник

Ответы:

123

РЕДАКТИРОВАТЬ: комментарий Коннора с ответом Мехди необходим для этой работы. Спасибо обоим за разъяснения.

->appends()может принять массив в качестве параметра, вы можете передать его Input::except('page'), что должно помочь.

Пример:

return view('manage/users', [
    'users' => $users->appends(Input::except('page'))
]);
Александр Дано
источник
37
Просто обратите внимание на других гуглеров, идущих этим путем - теперь оно множественное appends, а не append . Правильная цепочка будет примерно такой$query->appends($foo)->links();
Коннор Пит
6
Я обнаружил, что $query->appends(Input::except('page'))->links();работает лучше. В противном случае переменная страницы не обновлялась при нажатии на страницу. Laravel 4.1.24.
bitlather
... а затем я прокрутил страницу вниз, чтобы увидеть решение Мехди.
bitlather
2
ЛАРАВЕЛ 5: {!! $myItems->appends(Input::except('page'))->render() !!}
ecairol
2
В laravel 5.2 вы должны использовать Request вместо Input
Christophvh
105

Я думаю, вам следует использовать этот код в Laravel 5. Также это будет работать не только с параметром, pageно и с любым другим параметром (ами):

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

Лично я стараюсь не использовать Facadesстолько, сколько могу. Использование глобальных вспомогательных функций требует меньше кода и намного элегантнее.

ОБНОВИТЬ:

Не используйте InputFacade, поскольку он устарел в Laravel v6 +

Хасан Азими
источник
2
Это сработало для laravel 5.6, использование принятого решения ответа вызвало для меня ошибку.
Мухмед Азиз
1
Я также успешно реализовал это в проекте 5.3; Я тоже предпочитаю этот простой метод
kjones
3
Кроме того, я заметил, что вам не нужно использовать except('page')это решение.
BakerStreetSystems
1
Очень полезно. Спасибо
Viraj Amarasinghe
40

Имейте в виду Input::all(), он будет ?page=снова и снова включать предыдущие значения на каждой странице, которую вы открываете!
например, если вы находитесь внутри ?page=1и открываете следующую страницу, она откроется. ?page=1&page=2
Таким образом, последнее значение, которое принимает страница, будет той, которую вы видите! не та страница, которую ты хочешь увидеть

Решение: использовать Input::except(array('page'))

Мехди Магруни
источник
40

Вы могли бы использовать

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

Пример в контроллере:

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

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

Пример в представлении:

{{ $users->appends(request()->query())->links() }}
Александр Копелевич
источник
3
Это предложен Мохамедом Саидом (сотрудником Laravel), см .: github.com/laravel/framework/issues/…
Рой,
1
Я думаю, что это лучший ответ из-за того, что сказал @roy + лучшие примеры. Также у него есть пример контроллера + пример просмотра.
Маки 01
2
Работал у меня. +1
Манодж Кумар
1
Это лучшее решение, это сработало и для меня
Jithin
28

Не append()но appends() Итак, правильный ответ:

{!! $records->appends(Input::except('page'))->links() !!}
Лысый
источник
11

ЛАРАВЕЛЬ 5

Представление должно содержать что-то вроде:

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

экаирол
источник
5

Используйте эту конструкцию, чтобы сохранить все входные параметры, кроме страницы

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

Зачем?

1) вы убираете все, что добавлено в запрос таким образом

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

2) вам не нужен $ request в качестве входного параметра для функции

3) вы исключаете "страницу"

PS) и он работает для Laravel 5.1

Евгений Афанасьев
источник
5

Laravel 7.x добавил новый метод в пагинатор:

->withQueryString()

Таким образом, вы можете использовать это как:

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

Для laravel ниже 7.x используйте:

{{ $users->appends(request()->query())->links() }}
Рикеш Шреста
источник
Ух ты, это потрясающе всего одна строчка. Я пропустил документы. Хотя 7.x это любовь
MR_AMDEV
вы предоставляете 2 подхода. Пожалуйста, дифференцируйте их и предоставьте информацию, какой из них лучше и полезнее
MR_AMDEV
Лучший ответ. Я бы отдал 2 голоса, если бы мог :)
iWizard
1
@MR_AMDEV за капотом оба одинаковые. Laravel просто адаптировал его в своей последней версии.
Рикеш Шреста
4

Включите это в свою страницу просмотра

 $users->appends(Input::except('page'))
Шива Ганеш
источник
4

для тех, кто в laravel 5 или выше в blade:

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

вы можете получить пройденный предмет с

$passed_item=$request->id;

проверить это с

dd($passed_item);

ты должен получить что-нибудь ценное

Мостафа Асади
источник
0

Также передайте номер страницы для нумерации страниц. Что-то вроде этого

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

Ченгкуру Майкл
источник