Вступление
В других рамках нумерация страниц может быть очень болезненной. 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\Paginator
Illuminate\Pagination\LengthAwarePaginator
Paginator
Класс не нужно знать общее количество элементов в наборе результатов; однако из-за этого у класса нет методов для получения индекса последней страницы. LengthAwarePaginator
Принимает почти те же аргументы, что и Paginator
; однако для этого требуется подсчет общего количества элементов в наборе результатов.
Другими словами, Paginator
соответствует simplePaginate
методу на построителе запросов и Eloquent, а LengthAwarePaginator
соответствует paginate
методу.
При создании экземпляра paginator вручную вы должны вручную «разрезать» массив результатов, которые вы передаете в paginator. Если вы не знаете, как это сделать, проверьте PHP-функцию array_slice .
Отображение результатов пагинации
При вызове paginate
метода вы получите экземпляр . При вызове метода вы получите экземпляр . Эти объекты предоставляют несколько методов, которые описывают набор результатов. В дополнение к этим вспомогательным методам экземпляры paginator являются итераторами и могут быть зациклены в виде массива. Итак, когда вы получили результаты, вы можете отобразить результаты и отобразить ссылки на страницы, используя Blade:Illuminate\Pagination\LengthAwarePaginator
simplePaginate
Illuminate\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=N
custom/url
withPath
Route::get('users', function () {
$users = App\User::paginate(15);
$users->withPath('custom/url');
//
});
Добавление к ссылкам на страницы
Вы можете добавить к строке запроса ссылок на страницы, используя appends
метод. Например, чтобы добавить к каждой пагинационной ссылке, вы должны сделать следующий вызов :sort=votes
appends
{{ $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\Jsonable
toJson
Route::get('users', function () {
return App\User::paginate();
});
JSON из постраничной навигации будет включать в себя мету информации , такие как total
, current_page
, last_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/vendor
vendor:publish
php artisan vendor:publish --tag=laravel-pagination
Эта команда поместит представления в каталог. Файл в этом каталоге соответствует виду по умолчанию постраничного. Вы можете редактировать этот файл, чтобы изменить нумерацию страниц HTML.resources/views/vendor/pagination
bootstrap-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 для данного номера страницы. |
0 комментариев