Пагинация
Введение
В других фрейморках пагинация (постраничный вывод данных) может быть большой проблемой. 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
.