Класс CursorPaginator
Класс CursorPaginator применяется для пагинации записей с использованием курсоров вместо номеров страниц. Этот подход особенно эффективен для больших наборов данных, так как не требует подсчёта общего количества записей и не страдает от проблем с пропуском страниц, характерных для традиционной пагинации. Первым параметром в конструктор передаётся коллекция элементов, вторым - экземпляр курсора, третьим - количество элементов на странице, четвёртым - массив опций.
Синтаксис
<?php
use Illuminate\Pagination\CursorPaginator;
use Illuminate\Pagination\Cursor;
$paginator = new CursorPaginator($items, $cursor, $perPage, $options);
?>
Для создания экземпляра класса используется метод cursorPaginate, доступный в построителе запросов и Eloquent.
Пример
Получим список статей с использованием курсорной пагинации с шагом в 10 записей на страницу:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::cursorPaginate(10);
return view('articles.index', ['articles' => $articles]);
}
}
?>
Результат выполнения кода в представлении:
@foreach ($articles as $article)
<div>
{{ $article->title }}
</div>
@endforeach
{{ $articles->links() }}
Пример
Используем курсорную пагинацию с дополнительными условиями фильтрации. Отфильтруем статьи по статусу и отсортируем по дате создания:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::where('status', 'published')
->orderBy('created_at', 'desc')
->cursorPaginate(15);
return view('articles.index', ['articles' => $articles]);
}
}
?>
Пример
Покажем, как получить информацию о текущем и следующем курсорах для навигации. Доступ к курсорам осуществляется через методы nextCursor и previousCursor:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
public function index(Request $request)
{
$articles = Article::cursorPaginate(10);
$nextCursor = $articles->nextCursor();
$previousCursor = $articles->previousCursor();
$res = [
'next_cursor' => $nextCursor ? $nextCursor->encode() : null,
'previous_cursor' => $previousCursor ? $previousCursor->encode() : null,
'has_more_pages' => $articles->hasMorePages(),
'on_first_page' => $articles->onFirstPage()
];
return response()->json($res);
}
}
?>
Результат выполнения кода:
{
"next_cursor": "eyJpZCI6MTB9",
"previous_cursor": null,
"has_more_pages": true,
"on_first_page": true
}
Пример
Используем курсорную пагинацию с кастомными параметрами в URL. Метод withQueryString сохраняет все параметры запроса при генерации ссылок навигации:
<?php
namespace App\Http\Controllers;
use App\Models\Article;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
public function index(Request $request)
{
$articles = Article::where('category', $request->category)
->orderBy('id')
->cursorPaginate(20)
->withQueryString();
return view('articles.index', ['articles' => $articles]);
}
}
?>
Смотрите также
-
метод
cursorPaginate,
который создаёт курсорный пагинатор для запроса -
метод
paginate,
который создаёт стандартный пагинатор с номерами страниц -
метод
simplePaginate,
который создаёт простой пагинатор без общего количества записей -
метод
nextCursor,
который возвращает курсор для следующей страницы