Unetway

Laravel - Pagination

Вступление

В других рамках нумерация страниц может быть очень болезненной. Paginator от Laravel интегрирован с построителем запросов и Eloquent ORM и обеспечивает удобное и простое в использовании разбиение на страницы результатов базы данных из коробки. HTML, сгенерированный paginator, совместим с фреймворком Bootstrap CSS .

 

Основное использование

Разбиение результатов в Query Builder

Есть несколько способов разбить элементы на страницы. Простейшим является использование paginateметода в построителе запросов или запрос Eloquent . paginateМетод автоматически заботится о настройке надлежащего предела и смещения на основе текущей страницы рассматривается пользователем. По умолчанию текущая страница определяется по значению pageаргумента строки запроса в HTTP-запросе. Это значение автоматически определяется Laravel, а также автоматически вставляется в ссылки, сгенерированные paginator.

В этом примере единственный аргумент, передаваемый paginateметоду, - это количество элементов, которые вы хотите отобразить «на страницу». В этом случае давайте укажем, что мы хотели бы отображать 15элементы на странице:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;

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]);
    }
}

В настоящее время операции пагинации, использующие groupByоператор, не могут быть эффективно выполнены Laravel. Если вам нужно использовать groupByнабор результатов с разбивкой по страницам, рекомендуется выполнить запрос к базе данных и вручную создать разбиватель на страницы.

"Простая нумерация страниц"

Если вам нужно только отобразить простые ссылки «Далее» и «Предыдущие» в виде разбивки на страницы, вы можете использовать этот simplePaginateметод для выполнения более эффективного запроса. Это очень полезно для больших наборов данных, когда вам не нужно отображать ссылку для каждого номера страницы при отображении вашего представления:

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

 

Разбивающие красноречивые результаты

Вы также можете разбивать Eloquent на страницы . В этом примере мы разбиваем Userмодель 15на страницы с элементами. Как видите, синтаксис почти идентичен результатам разбивки на страницы:

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

Вы можете позвонить paginateпосле установки других ограничений на запрос, таких как whereпункты:

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

Вы также можете использовать этот simplePaginateметод при разбиении на страницы моделей Eloquent:

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

 

Создание Paginator вручную

Иногда вы можете захотеть создать экземпляр разбиения на страницы вручную, передав ему массив элементов. Вы можете сделать это, создав экземпляр или экземпляр, в зависимости от ваших потребностей.Illuminate\Pagination\PaginatorIlluminate\Pagination\LengthAwarePaginator

PaginatorКласс не нужно знать общее количество элементов в наборе результатов; однако из-за этого у класса нет методов для получения индекса последней страницы. LengthAwarePaginatorПринимает почти те же аргументы, что и Paginator; однако для этого требуется подсчет общего количества элементов в наборе результатов.

Другими словами, Paginatorсоответствует simplePaginateметоду на построителе запросов и Eloquent, а LengthAwarePaginatorсоответствует paginateметоду.

При создании экземпляра paginator вручную вы должны вручную «разрезать» массив результатов, которые вы передаете в paginator. Если вы не знаете, как это сделать, проверьте PHP-функцию array_slice .

 

Отображение результатов пагинации

При вызове paginateметода вы получите экземпляр . При вызове метода вы получите экземпляр . Эти объекты предоставляют несколько методов, которые описывают набор результатов. В дополнение к этим вспомогательным методам экземпляры paginator являются итераторами и могут быть зациклены в виде массива. Итак, когда вы получили результаты, вы можете отобразить результаты и отобразить ссылки на страницы, используя Blade:Illuminate\Pagination\LengthAwarePaginatorsimplePaginateIlluminate\Pagination\Paginator

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

{{ $users->links() }}

linksМетод будет оказывать ссылки на остальные страницы в наборе результатов. Каждая из этих ссылок уже будет содержать правильную pageпеременную строки запроса. Помните, что HTML-код, сгенерированный linksметодом, совместим с платформой Bootstrap CSS .

Настройка URI Paginator

Этот withPathметод позволяет вам настроить URI, используемый paginator при генерации ссылок. Например, если вы хотите, чтобы paginator генерировал ссылки наподобие , вы должны перейти к методу:http://example.com/custom/url?page=Ncustom/urlwithPath

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

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

    //
});

Добавление к ссылкам на страницы

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

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

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

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

Настройка окна ссылок на страницы

Вы можете контролировать количество дополнительных ссылок, отображаемых на каждой стороне URL-адреса «окна» пагинатора. По умолчанию три ссылки отображаются на каждой стороне основных ссылок пагинатора. Однако вы можете контролировать этот номер, используя onEachSideметод:

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

 

Преобразование результатов в JSON

Классы результатов Paginator в Laravel реализуют контракт Interface и предоставляют метод, поэтому преобразовать результаты разбивки на страницы в JSON очень просто. Вы также можете преобразовать экземпляр paginator в JSON, вернув его из маршрута или действия контроллера:Illuminate\Contracts\Support\JsonabletoJson

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

JSON из постраничной навигации будет включать в себя мету информации , такие как totalcurrent_pagelast_pageи многие другие. Фактические объекты результата будут доступны через dataключ в массиве JSON. Вот пример JSON, созданного путем возврата экземпляра paginator из маршрута:

{
   "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
        }
   ]
}

 

Настройка вида пагинации

По умолчанию представления, отображаемые для отображения ссылок на страницы, совместимы с платформой Bootstrap CSS. Однако, если вы не используете Bootstrap, вы можете определить свои собственные представления для отображения этих ссылок. При вызове linksметода в экземпляре paginator передайте имя представления в качестве первого аргумента методу:

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

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

Однако самый простой способ настроить представления разбивки на страницы - экспортировать их в свой каталог с помощью команды:resources/views/vendorvendor:publish

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

Эта команда поместит представления в каталог. Файл в этом каталоге соответствует виду по умолчанию постраничного. Вы можете редактировать этот файл, чтобы изменить нумерацию страниц HTML.resources/views/vendor/paginationbootstrap-4.blade.php

Если вы хотите назначить другой файл в качестве представления разбиения на страницы по умолчанию, вы можете использовать параметры defaultViewи defaultSimpleViewметоды разбиения на страницы в вашем AppServiceProvider:

use Illuminate\Pagination\Paginator;

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

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

 

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

Каждый экземпляр paginator предоставляет дополнительную информацию о нумерации страниц следующими способами:

метод Описание
$results->count() Получить количество элементов для текущей страницы.
$results->currentPage() Получить номер текущей страницы.
$results->firstItem() Получить номер результата первого элемента в результатах.
$results->getOptions() Получить варианты пагинатора.
$results->getUrlRange($start, $end) Создайте диапазон страниц с нумерацией страниц.
$results->hasMorePages() Определите, достаточно ли элементов для разделения на несколько страниц.
$results->lastItem() Получить номер результата последнего элемента в результатах.
$results->lastPage() Получить номер последней доступной страницы.(Недоступно при использовании simplePaginate).
$results->nextPageUrl() Получить URL для следующей страницы.
$results->onFirstPage() Определите, если страница находится на первой странице.
$results->perPage() Количество элементов, которые будут показаны на странице.
$results->previousPageUrl() Получить URL для предыдущей страницы.
$results->total() Определите общее количество подходящих элементов в хранилище данных. (Недоступно при использовании simplePaginate).
$results->url($page) Получить URL для данного номера страницы.