Пагинатор Laravel интегрирован с query builder`ом и Eloquent ORM и обеспечивает удобную, простую в использовании разбивку на страницы записей базы данных с нулевой конфигурацией.
По умолчанию HTML, генерируемый пагинатором, совместим с фреймворком Tailwind CSS; однако, также доступна поддержка разбивки на страницы с использованием Bootstrap.
Как создать свой шаблон пагинации
Представление
Создадим подключающуюся часть шаблона resources/views/includes/pagination.blade.php
Со следующим содержимым (разметка Bootstrap):
@if ($paginator->hasPages())
<nav aria-label="Pagination">
<hr class="my-0" />
<ul class="pagination justify-content-center my-4">
@if ($paginator->onFirstPage())
<li class="page-item disabled"><span class="page-link">Newer</span></li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">Newer</a>
</li>
@endif
@foreach ($elements as $element)
@if (is_string($element))
<li class="page-item disabled"><span class="page-link">{{ $element }}</span></li>
@endif
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
@else
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
@endif
@endforeach
@endif
@endforeach
@if ($paginator->hasMorePages())
<li class="page-item"><a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">Older</a></li>
@else
<li class="page-item disabled"><span>Older</span></li>
@endif
</ul>
</nav>
@endif
и подключим в месте, где нужно вывести пагинацию:
{{ $users->links('includes.pagination') }}
В данном случае пагинация у нас пойдет по массиву $users
.
Контроллер
Ниже приведен пример кода контроллера, который обеспечит данными переменную.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
/**
* Показать всех пользователей приложения.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('user.index', [
'users' => DB::table('users')->paginate(15)
]);
}
}
Offset пагинация
Пагинация со смещением используется в программировании чаще всего.
Обычная пагинация
use App\Models\User;
$users = User::paginate(15);
Метод paginate()
подсчитывает общее количество записей, соответствующих запросу, перед извлечением записей из базы данных. Это сделано для того, чтобы пагинатор знал, сколько всего страниц с записями необходимо сформировать. Однако, если вы не планируете отображать общее количество страниц в пользовательском интерфейсе вашего приложения, запрос количества записей не нужен.
Упрощенная пагинация
use App\Models\User;
$users = User::orderBy('id')->simplePaginate(15);
Если вам нужно отображать только «Далее» и «Назад», вы можете использовать метод simplePaginate()
для одного запроса.
С доп. условием
$users = User::where('votes', '>', 100)->paginate(15);
Когда нужно вывести результат выборки.
Cursor пагинация
Курсорная пагинация — это высокопроизводительный способ разбиения на страницы, часто используемый для больших наборов данных, бесконечной прокрутки и API-интерфейсов.
PHP код:
$users = User::where('votes', '>', 100)->cursorPaginate(15);
или SQL запрос:
select * from users where `id` > 10 order by `id` asc limit 15;
Основное различие между offset и cursor заключается в том, что для offset использует sql-оператор offset, а cursor — оператор where.
Cursor-пагинация быстрее offset-пагинации, но имеет ряд ограничений в применении, так же для быстрой работы необходимо иметь индексы для поля в order by
.
Свой класс для пагинации
Paginator
соответствует методу simplePaginate
в построителе запросов, CursorPaginator
соответствует методу cursorPaginate
, а LengthAwarePaginator
соответствует методу paginate
.
При создании экземпляра пагинатора вручную вы должны вручную “разделить” массив результатов, который вы передаете пагинатору. Если вы не уверены, как это сделать, ознакомьтесь с функцией PHP array_slice.
Что почитать еще: