Пагинация
Содержание:
Введение
Работа с постраничным разбиением запросов (пагниацией) в других фреймворках может быть очень проблематичной.
Пагинатор Laravel интегрирован с конструктором запросов
и Eloquent ORM и предоставляет легкий
для исопльзования способ пагинации результатов выборки из базы данных. Сгенерированный пагинатором HTML
совместим с CSS фреймворком Bootstrap.
Типовое использование
Пагинация результатов конструктора запросов
Есть несколько способов провести пагинацию элементов выборки. Самый просто путь — это использовать
метод paginate
на конструктор запросов
или Eloquent ORM.
Метод paginate
автоматически позаботится об установке необходимых лимитов и отступов
основываясь на текущей странице просмотра пользователя. По умолчанию, текущая страница определяется
по значению аргумента page
для HTTP запроса. Это значение Ларавел определяет автоматически,
также автоматически вставляет в ссылки на страницы генерируемые пагинатором.
В этом примере, единственный аргумент передаваемы в метод paginate
— это число элементов, которое вы хотели бы отображать "постранично". В этом случае,
давайте укажем, что вы хотели бы отобразить 15 элементов на странице:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
/**
* Show all of the users for the application.
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->paginate(15);
return view('user.index', ['users' => $users]);
}
}
На текущий момент, операдции пагинации, которые используют выражение groupBy
,
не могут выполняться Ларавел эффективно. Если вам необходимо использовать groupBy
с набором разбитых на страницы результатов, то рекомендуется провести запрос к базе данных
и создать пагинатор вручную.
"Простая" пагинация
Если вам только лишь необходимо вывести простые ссылки "След." и "Пред."
для вашего представления, вы можете использовать метод simplePaginate
для реализации
более эффективного запроса. Это очень практично для больших наборов данных не показывать
ссылку на каждый номер, при отработке вашего представления:
$users = DB::table('users')->simplePaginate(15);
Пагинация результатов Eloquent
Вы также можете проводить пагинацию запросов Eloquent.
В этом примере мы разобьём на страницы модель User
по 15
элементов
на странице. Как вы сможете увидеть, синтаксис очень похож на пагинацию конструктора запросов:
$users = App\User::paginate(15);
Вы можете также вызвать paginate
после других ограничений для запроса,
таких как условия where
:
$users = User::where('votes', '>', 100)->paginate(15);
Вы можете также использовать метод simplePaginate
для пагинации моделей Eloquent:
$users = User::where('votes', '>', 100)->simplePaginate(15);
Создание пагинации вручную
Иногда вы можете захотеть создать паганицию вручную, путём передачи массива элементов.
Вы можете так поступить путём создания экземпляра Illuminate\Pagination\Paginator
или
Illuminate\Pagination\LengthAwarePaginator
в зависимости от ваших нужд.
Класс Paginator
может не располагать информацией об общем числе элементов
в наборе результав. Как следствие, у класса нет методом для получения индекса последней страницы.
Метод LengthAwarePaginator
принимает практически те же аргументы, что и Paginator
.
Однако, отличительной чертой является то, что метод LengthAwarePaginator
число
элементов в выборке.
Другими словами, метод Paginator
соответвует методу simplePaginate
для конструктора запросов или Eloquent, в то время как LengthAwarePaginator
соответсвует методу paginate
.
При создании пагинатора вручную, вы должны вручную делать нарезку массива, который вы передаёте
в пагинатор. Если у вас есть сомнения по поводу того, как это сделать, рекомендуется проверить
информацию о функции PHP
array_slice.
Методы пагинации
Каждый экземпляр пагинатора предоставляет дополнительную информацию с помощью следующих методов:
Метод |
Описание |
$results->count() |
Получить число элементов для текущей страницы. |
$results->currentPage() |
Получить текущий номер страницы. |
$results->firstItem() |
Получить порядковый номер первого элемента из результатов. |
$results->getOptions() |
Получить опции пагинатора. |
$results->getUrlRange($start, $end) |
Создать диапазон URL-ов пагинации. |
$results->hasMorePages() |
Определить, что есть достаточное число элементов для того, чтобы можно было разбить на несколько страниц. |
$results->items() |
Получить элементы для текущей страницы. |
$results->lastItem() |
Получить порядковый номер последнего элемента из результатов. |
$results->lastPage() |
Получить номер последней возможной страницы (не доступно для simplePaginate ). |
$results->nextPageUrl() |
Получить URL для следующей страницы. |
$results->onFirstPage() |
Определить, что пагинатор находится на первой странице. |
$results->perPage() |
Число элементов для показа на каждой странице. |
$results->previousPageUrl() |
Получить URL для предыдущей страницы. |
$results->total() |
Определить общее число совпадающих элементов в хранилище данных. (Не доступно для simplePaginate ). |
$results->url($page) |
Получить URL для данного номера страницы. |
$results->getPageName() |
Получить название страницы. |
$results->setPageName($name) |
Установить название страницы. |