Как правильно реализовать пагинацию для результата поиска?

Есть форма
<form method="get" action="/cards/search" id="formSearch">
    <div class="form-group">
        <label for="classHeroes">Класс</label>
        <select class="form-control" id="classHeroes" name="playerClass">
            <option>Все</option>
            @foreach ($heroes as $hero)
                <option value="{{ $hero->id }}">{{ $hero->name }}</option>
            @endforeach
        </select>
    </div>
    <button type="submit" class="btn btn-search-color btn-block">Найти</button>
</form>


Результат запроса выводится в шаблон
@foreach ($cards as $card)
    <div class="block-card d-flex justify-content-center" data-toggle="tooltip-cards" data-placement="right">
        {{ card->name }}
    </div>
@endforeach
<div class="container">
    <div class="row d-flex justify-content-center">
        {{ $cards->links() }}
    </div>
</div>


Обрабатывает форму Ajax
$('#formSearch').submit(function (event) {
    event.preventDefault();
    var query = $(this).serialize();

    $.ajax({
        type: 'GET',
        url: '/cards/search',
        data: query,
        success: function (data) {
            $('.block-cards').html(data);
        }
    });
});

/ * Пагинация Ajax результата поиска */

$(function() {
    $('body').on('click', '.pagination a', function(e) {
        e.preventDefault();

        var url = $(this).attr('href');
        getCards(url);
    });

    function getCards(url) {
        $.ajax({
            type: 'GET',
            url : url
        }).done(function (data) {
            $('.block-cards').html(data);
        });
    }
});


Route
Route::get('/cards/search', 'CardsController@search')->name('search');


Контроллер
public function search(Request $request)
{
    if ($request->ajax())
    {
        $query = $request->all();
            
        // Удаляем данные из запроса со значением "Все"
        foreach ($query as $key => $item) {
            if ($query[$key] == 'Все')
                unset($query[$key]);
        }

        $this->cards = Card::query()->where($query, '=', array_flip($query))->paginate($this->perPage)
                                                   ->appends($query);

        return view('default.cards.cardsload', ['cards' => $this->cards]);
    }       
}


Проблема заключается в следующем. Когда я заполняю форму и выполняю запрос, выводятся данные, но если я в пагинации выбираю другую страницу, то ничего не происходит.
  • Вопрос задан
  • 224 просмотра
Решения вопроса 1
@trycode Автор вопроса
Решено, нужно было удалить из запроса параметр $page, так как он подставлялся в запрос select

// Удаляем данные из запроса со значением "Все"
        foreach ($query as $key => $item) {
            if ($key == 'page' || $query[$key] == 'Все')
                unset($query[$key]);
        }

        $this->cards = Card::query()->where($query, '=', array_flip($query))->paginate($this->perPage)->appends($request->all());
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
swede2k
@swede2k
Full-stack developer
Скорее всего при пагинации Вы не передаете условия поиска. Ссылка на пагинацию должна быть примерно такого вида - /search?page=2&query=Superman
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы