Метод cursorPaginate
Метод cursorPaginate применяется к запросу Eloquent
или Query Builder и возвращает экземпляр CursorPaginator.
Он принимает два параметра: количество элементов на странице
(по умолчанию 15) и массив столбцов для выборки
(по умолчанию ['*']). Курсорная пагинация особенно
эффективна для бесконечной прокрутки и больших таблиц,
так как не использует оператор OFFSET в SQL-запросе,
что значительно ускоряет выборку на больших объёмах данных.
Синтаксис
<?php
Model::cursorPaginate($perPage, $columns);
?>
Пример
Давайте получим статьи по 5 штук на странице с помощью курсорной пагинации:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::cursorPaginate(5);
return view('articles.index', ['articles' => $articles]);
}
}
?>
Пример
Давайте выведем статьи с помощью курсорной пагинации в Blade-шаблоне:
@foreach ($articles as $article)
<div>
<h3>{{ $article->title }}</h3>
<p>{{ $article->body }}</p>
</div>
@endforeach
<div>
@if ($articles->previousCursor())
<a href="{{ $articles->previousPageUrl() }}">Previous</a>
@endif
@if ($articles->nextCursor())
<a href="{{ $articles->nextPageUrl() }}">Next</a>
@endif
</div>
Пример
Давайте используем курсорную пагинацию с выборкой конкретных столбцов:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::select('id', 'title', 'created_at')
->cursorPaginate(10, ['id', 'title', 'created_at']);
foreach ($articles as $article) {
echo $article->title . "\n";
}
}
}
?>
Результат выполнения кода:
"Article 1"
"Article 2"
"Article 3"
"Article 4"
"Article 5"
"Article 6"
"Article 7"
"Article 8"
"Article 9"
"Article 10"
Пример
Давайте используем курсорную пагинацию с условием фильтрации:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::where('status', 'published')
->orderBy('id')
->cursorPaginate(5);
foreach ($articles as $article) {
echo $article->title . "\n";
}
}
}
?>
Результат выполнения кода:
"Published Article 1"
"Published Article 2"
"Published Article 3"
"Published Article 4"
"Published Article 5"
Пример
Давайте получим информацию о курсорах текущей страницы:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::cursorPaginate(3);
echo "Next cursor: " . ($articles->nextCursor() ? $articles->nextCursor()->encode() : 'none') . "\n";
echo "Previous cursor: " . ($articles->previousCursor() ? $articles->previousCursor()->encode() : 'none') . "\n";
echo "Has more pages: " . ($articles->hasMorePages() ? 'true' : 'false') . "\n";
}
}
?>
Результат выполнения кода:
"Next cursor: eyJpZCI6MywicG9pbnRlciI6eyJpZCI6M319"
"Previous cursor: none"
"Has more pages: true"
Смотрите также
-
метод
paginate,
который реализует стандартную пагинацию с указанием количества страниц -
метод
simplePaginate,
который реализует простую пагинацию без общего количества записей -
класс
CursorPaginator,
который представляет результат курсорной пагинации -
метод
nextCursor,
который возвращает курсор для следующей страницы