Пагинация

Введение

В других фрейморках пагинация (постраничный вывод данных) может быть большой проблемой. Laravel же делает этот процесс безболезненным. Фреймворк способен сам генерировать диапазон ссылок относительно текущей страницы. Сгенерированная разметка совместима с фреймворком Twitter Bootstrap.

Использование

Есть несколько способов разделения данных на страницы. Самый простой - используя метод paginate объекта-построителя запросов или в связке с моделями Eloquent.

Постраничный вывод выборки из БД

$users = DB::table('users')->paginate(15);

Примечание: Если вы используете groupBy в запросе, то встроенная пагинация Laravel будет работать неэффективно. В этом случае вам нужно создать пагинатор вручную.

Создание пагинатора вручную

Иногда возникает потребность создать пагинатор вручную, передав ему массив элементов. Сделать это можно, создав объект Illuminate\Pagination\Paginator или Illuminate\Pagination\LengthAwarePaginator, в зависимости от задачи.

Постраничный вывод моделей Eloquent

$users = User::where('votes', '>', 100)->paginate(15);

Аргумент, передаваемый методу paginate - число строк, которые вы хотите видеть на одной странице. Блок пагинации в шаблоне отображаются методом render:

<div class="container">
    <?php foreach ($users as $user): ?>
        <?php echo $user->name; ?>
    <?php endforeach; ?>
</div>

<?php echo $users->render(); ?>

Это всё, что нужно для создания страничного вывода! Заметьте, что нам не понадобилось уведомлять фреймворк о номере текущей страницы - Laravel определит его сам. Номер страницы добавляется к URL в виде параметра запроса: ?page=N.

Вы можете получить информацию о текущем положении с помощью этих методов:

  • currentPage
  • lastPage
  • perPage
  • total
  • count

«Упрощённая пагинация»

Если вам нужно выводить только ссылки «Следующая страница» и «Предыдущая страница», то вы можете использовать метод simplePaginate. В таком случае запрос в БД будет более простым. Это полезно на очень больших объемах данных и там, где пользователю нужны первые несколько страниц и нет необходимости переходить в самую глубину.

$someUsers = User::where('votes', '>', 100)->simplePaginate(15);

Настройка URL для вывода ссылок

$users = User::paginate();

$users->setPath('custom/url');

Пример выше создаст ссылки наподобие такой: http://example.com/custom/url?page=2

Параметры в ссылках

Вы можете добавить параметры запросов к ссылкам страниц с помощью метода appends страничного объекта:

<?php echo $users->appends(['sort' => 'votes'])->render(); ?>

Код выше создаст ссылки наподобие http://example.com/something?page=2&sort=votes

Чтобы добавить к URL хэш-параметр («#xyz»), используйте метод fragment:

<?php echo $users->fragment('foo')->render(); ?>

Код выше создаст ссылки типа http://example.com/something?page=2#foo

Конвертация в JSON

Класс Paginator реализует (implements) Illuminate\Contracts\Support\JsonableInterface, следовательно, у него есть метод toJson, который используется для вывода пагинируемой информации в формате json. Помимо пагинируемых данных, которые располагаются в data, этот метод добавляет мета-информацию, а именно: total, current_page и last_page.