Laravel. Пагинация

Как создать свою пагинацию в Laravel
laravel cover

Пагинатор 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.

 

Что почитать еще:

Документация laravel
Habr

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *