Версія фреймворка: 8.x

База даних: пагінація

Вступ

В інших рамках пагінація може бути дуже болючою. Пагінатор Laravel інтегрований зконструктор запитівіКрасномовний ОРМі забезпечує зручну, просту у використанні пагінацію результатів баз даних нестандартно. За замовчуванням HTML, створений пагінатором, сумісний зФреймворк CSS Tailwind; однак доступні також views Bootstrap.

Базове використання

Paginating Query Builder Results

Є кілька способів перенесення сторінок на сторінки. Найпростішим є використанняpaginateметод наконструктор запитівабо anКрасномовний запит.paginateметод автоматично дбає про встановлення належного ліміту та зміщення на основі поточної сторінки, яку переглядає користувач. За замовчуванням поточна сторінка визначається за значеннямpageаргумент рядка запиту на запит HTTP. Це значення автоматично визначається Laravel, а також автоматично вставляється в посилання, створені пагінатором.

У цьому прикладі єдиний аргумент, переданий в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]);
    }
}
В даний час операції з нумерацією сторінок, які використовують agroupByоператор не може бути ефективно виконаний Laravel. Якщо вам потрібно використовувати agroupByз набором сторінок із сторінками рекомендується здійснити запит до бази даних і створити пагінатор вручну.

"Проста пагінація"

Якщо вам потрібно лише відобразити прості посилання "Далі" та "Попередній" у поданні пагінації, ви можете використовуватиsimplePaginateметод для виконання більш ефективного запиту. Це дуже корисно для великих наборів даних, коли вам не потрібно відображати посилання для кожного номера сторінки під час рендерингу вашого views:

$users = DB::table('users')->simplePaginate(15);

Paginating Eloquent результатів

Ви також можете зробити сторінкуКрасномовнийзапитів. У цьому прикладі ми передамо сторінкуUserмодель з15елементів на сторінці. Як бачите, синтаксис майже ідентичний результатам побудови пошукових запитів:

$users = App\Models\User::paginate(15);

Ви можете зателефонуватиpaginateпісля встановлення інших обмежень для запиту, таких якwhereречення:

$users = User::where('votes', '>', 100)->paginate(15);

Ви також можете використовуватиsimplePaginateметод підбиття сторінок Eloquent моделей:

$users = User::where('votes', '>', 100)->simplePaginate(15);

Створення Paginator вручну

Іноді вам може знадобитися створити екземпляр пагінації вручну, передавши йому масив елементів. Ви можете зробити це, створивши абоIlluminate\Pagination\PaginatorабоIlluminate\Pagination\LengthAwarePaginatorнаприклад, залежно від ваших потреб.

Paginatorкласу не потрібно знати загальну кількість елементів у наборі результатів; однак через це клас не має методів для отримання індексу останньої сторінки.LengthAwarePaginatorприймає майже ті самі аргументи, що іPaginator; однак для цього потрібен підрахунок загальної кількості елементів у наборі результатів.

Іншими словами,PaginatorвідповідаєsimplePaginateметод на конструкторі запитів та Eloquent, тоді якLengthAwarePaginatorвідповідаєpaginateметод.

Під час створення вручну екземпляра пагінатора слід вручну "нарізати" масив результатів, які ви передаєте пагінатору. Якщо ви не впевнені, як це зробити, перегляньтеarray_sliceФункція PHP.

Відображення результатів пагінації

При дзвінку вpaginateметод, ви отримаєте екземплярIlluminate\Pagination\LengthAwarePaginator. При дзвінку вsimplePaginateметод, ви отримаєте екземплярIlluminate\Pagination\Paginator. Ці об'єкти забезпечують декілька методів, що описують набір результатів. На додаток до цих допоміжних методів, екземпляри пагінатора є ітераторами і можуть бути циклічними як циклічний масив. Отже, після того, як ви отримали результати, ви можете відобразити результати та відтворити посилання на сторінки за допомогоюBlade:

<div class="container">
    @foreach ($users as $user)
        {{ $user->name }}
    @endforeach
</div>

{{ $users->links() }}

linksметод відобразить посилання на решту сторінок у наборі результатів. Кожне з цих посилань уже міститиме належнеpageзмінна рядка запиту. Пам'ятайте, HTML, сформованийlinksметод сумісний зФреймворк CSS Tailwind.

Налаштування URI Paginator

withPathМетод дозволяє налаштувати URI, який використовується пагінатором при генерації посилань. Наприклад, якщо ви хочете, щоб пагінатор генерував такі посиланняhttp://example.com/custom/url?page=N, вам слід пройтиcustom/urlдоwithPathметод:

Route::get('users', function () {
    $users = App\Models\User::paginate(15);

    $users->withPath('custom/url');

    //
});

Додавання до посилань на пагінацію

Ви можете додати до рядка запиту посилання на пагінацію за допомогоюappendsметод. Наприклад, додатиsort=votesдо кожного посилання на пагінацію, вам слід зробити наступний дзвінокappends:

{{ $users->appends(['sort' => 'votes'])->links() }}

Якщо ви хочете додати всі поточні значення рядка запиту до посилань на пагінацію, ви можете використовуватиwithQueryStringметод:

{{ $users->withQueryString()->links() }}

Якщо ви хочете додати "хеш-фрагмент" до URL-адрес пагінатора, ви можете використовуватиfragmentметод. Наприклад, додати#fooдо кінця кожного посилання на пагінацію зробіть наступний дзвінок наfragmentметод:

{{ $users->fragment('foo')->links() }}

Налаштування вікна посилання на пагінацію

Ви можете контролювати, скільки додаткових посилань відображається з кожного боку "вікна" URL-адреси пагінатора. За замовчуванням три посилання відображаються на кожній стороні основних посилань сторінок. Однак ви можете керувати цим номером за допомогоюonEachSideметод:

{{ $users->onEachSide(5)->links() }}

Перетворення результатів у JSON

Класи результатів пагінатора Laravel реалізуютьIlluminate\Contracts\Support\JsonableІнтерфейс контракту і викритиtoJson, тому дуже легко перетворити результати пагінації в JSON. Ви також можете перетворити екземпляр пагінатора в JSON, повернувши його з дії маршруту або контролера:

Route::get('users', function () {
    return App\Models\User::paginate();
});

JSON від пагінатора включатиме таку інформацію, якtotal,current_page,last_page, і більше. Фактичні об'єкти результатів будуть доступні черезdataключ у масиві JSON. Ось приклад JSON, створеного поверненням екземпляра пагінатора з маршруту:

{
   "total": 50,
   "per_page": 15,
   "current_page": 1,
   "last_page": 4,
   "first_page_url": "http://laravel.app?page=1",
   "last_page_url": "http://laravel.app?page=4",
   "next_page_url": "http://laravel.app?page=2",
   "prev_page_url": null,
   "path": "http://laravel.app",
   "from": 1,
   "to": 15,
   "data":[
        {
            // Result Object
        },
        {
            // Result Object
        }
   ]
}

Налаштування views пагінації

За замовчуванням views, що відображаються для відображення посилань на пагінацію, сумісні з фреймворком Tailwind CSS. Однак, якщо ви не використовуєте Tailwind, ви можете самостійно визначати власні погляди для відтворення цих посилань. При дзвінку вlinksметоду на екземплярі пагінатора, передайте ім'я views як перший аргумент методу:

{{ $paginator->links('view.name') }}

// Passing data to the view...
{{ $paginator->links('view.name', ['foo' => 'bar']) }}

Однак найпростіший спосіб налаштувати views сторінок з розміщенням сторінок - експортувати їх до вашогоresources/views/vendorкаталог за допомогоюvendor:publishкоманда:

php artisan vendor:publish --tag=laravel-pagination

Ця команда розмістить views уresources/views/vendor/paginationкаталог.tailwind.blade.phpфайл у цьому каталозі відповідає поданню сторінок за замовчуванням. Ви можете редагувати цей файл, щоб змінити HTML пагінації.

Якщо ви хочете призначити інший файл як views сторінок за замовчуванням, ви можете скористатися файлом пагінатораdefaultViewіdefaultSimpleViewметодів у вашомуAppServiceProvider:

use Illuminate\Pagination\Paginator;

public function boot()
{
    Paginator::defaultView('view-name');

    Paginator::defaultSimpleView('view-name');
}

Використання Bootstrap

Laravel включає пагінаційні views, побудовані за допомогоюBootstrap CSS. Щоб використовувати ці views замість стандартних Views Tailwind, ви можете зателефонувати до пагінатораuseBootstrapметод у вашомуAppServiceProvider:

use Illuminate\Pagination\Paginator;

public function boot()
{
    Paginator::useBootstrap();
}

Методи екземпляра Paginator

Кожен екземпляр пагінатора надає додаткову інформацію про пагінацію за допомогою таких методів:

Метод Опис
$paginator->count() Отримайте кількість елементів для поточної сторінки.
$paginator->currentPage() Отримайте номер поточної сторінки.
$paginator->firstItem() Отримайте номер результату першого елемента в результатах.
$paginator->getOptions() Отримайте параметри пагінатора.
$paginator->getUrlRange($start, $end) Створіть діапазон URL-адрес з пагінацією.
$paginator->hasPages() Визначте, чи достатньо елементів для розділення на кілька сторінок.
$paginator->hasMorePages() Визначте, чи більше елементів у сховищі даних.
$paginator->items() Отримайте елементи для поточної сторінки.
$paginator->lastItem() Отримайте номер результату останнього елемента в результатах.
$paginator->lastPage() Отримайте номер останньої доступної сторінки. (Недоступно під час використанняsimplePaginate).
$paginator->nextPageUrl() Отримайте URL-адресу для наступної сторінки.
$paginator->onFirstPage() Визначте, чи є сторінка першокласником.
$paginator->perPage() Кількість елементів, що відображаються на сторінці.
$paginator->previousPageUrl() Отримайте URL-адресу попередньої сторінки.
$paginator->total() Визначте загальну кількість відповідних елементів у сховищі даних. (Недоступно під час використанняsimplePaginate).
$paginator->url($page) Отримайте URL-адресу для вказаного номера сторінки.
$paginator->getPageName() Отримайте змінну рядка запиту, яка використовується для зберігання сторінки.
$paginator->setPageName($name) Встановіть змінну рядка запиту, яка використовується для зберігання сторінки.