ページネーション
- ページネーションを手動で作成する
- ページネーションされた結果を表示する
- 結果を JSON に変換する
- カスタム ページング ビュー
- Paginator インスタンス メソッド
はじめに
他のフレームワークでは、ページネーションが面倒になる場合があります。 Laravel のページネーションは、クエリ ビルダーと Eloquent ORM を組み合わせて、データベース結果セットの便利で使いやすいページネーションを提供します。ページネータによって生成された HTML は、Bootstrap CSS フレームワークと互換性があります。
##基本的な使用法## クエリ ビルダーページネーションデータをページネーションするにはいくつかの方法があります。最も簡単な方法は、クエリ ビルダーまたは Eloquent クエリの
paginateメソッドを使用することです。
paginatepaginate
このメソッドは、ユーザーが閲覧している現在のページ番号に基づいて、適切なオフセット offset と制限番号を自動的に設定します。デフォルトでは、HTTP リクエストのpage
クエリ パラメータ値は、現在のページのページ番号として扱われます。 Lavarel はこの値を自動的に検出し、ページネーターによって生成されたリンクに自動的に挿入します。次の例では、
メソッドに渡される唯一のパラメータは、各ページに表示するレコードの数です。ここでは、ページごとに
{note} 現在、Lavarel は15
個のデータを表示することを指定します:<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 显示应用程序中的所有用户。 * * @return Response */ public function index() { $users = DB::table('users')->paginate(15); return view('user.index', ['users' => $users]); } }
groupBy
ステートメント ページングを使用して効率的に実行できません。手術。
groupBy
を使用して結果セットをページ分割する必要がある場合は、手動でデータベースにクエリを実行し、ページ分割を作成することをお勧めします。単純なページングページ分割されたビューに「次のページ」と「前のページ」リンクを表示するだけの場合は、
simplePaginateメソッドを使用して、より効率的なクエリを実行します。これは、大量のデータがあり、ビューのレンダリング時に各ページのページ番号を表示する必要がない場合に便利です:
$users = DB::table('users')->simplePaginate(15);
Eloquent ページネーションEloquent クエリ結果をページネーションすることもできます。以下の例では、
Userモデルを
paginate15
項目/ページごとにページ分割します。ご覧のとおり、構文は基本的にクエリ ビルダーのページネーションと同じです。$users = App\User::paginate(15);
を呼び出す前に、クエリに
simplePaginatewhere
などの句を設定することもできます。制約:
Eloquent ページングで$users = User::where('votes', '>', 100)->paginate(15);
メソッドを使用することもできます:
$users = User::where('votes', '>', 100)->simplePaginate(15);
ページネーションを手動で作成する
ページネーションを手動で作成し、それに配列セットを渡したい場合があります。これは、ニーズに応じて、
Illuminate\Pagination\Paginator
またはIlluminate\Pagination\LengthAwarePaginator
のインスタンスを作成することで実現できます。 .Paginator
クラスは結果セットの合計数を知る必要はありませんが、このクラスには最後のページのインデックスを知る方法がありません。LengthAwarePaginator
はPaginator
とほぼ同じパラメータを受け入れますが、結果セットの総数をカウントします。つまり、
Paginator
はクエリ ビルダーまたは Eloquent のsimplePaginate
メソッドに相当し、LengthAwarePaginator
はpaginate# に相当します。 # # 方法。
{note} ページング インスタンスを手動で作成する場合は、ページング インスタンスに渡される結果配列を手動で「切り取る」必要があります。これについてわからない場合は、PHP の
結果セットの表示array_slice 関数を参照してください。
paginate
メソッドを呼び出すと、
Illuminate\Pagination\LengthAwarePaginatorインスタンスを取得します。
simplePaginateメソッドを呼び出して、
Illuminate\Pagination\Paginatorインスタンスを取得します。これらのオブジェクトは、結果セットを分析するためのいくつかのメソッドを提供します。これらのヘルパー メソッドに加えて、ページャー インスタンスは、配列のようにループできる反復子に結合されます。したがって、結果が取得されたら、Blade を使用してデータを表示し、ページング リンクをレンダリングできます。
<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
links
カスタム ページネータ URIメソッドを使用して、結果セット内の残りのページへのリンクをレンダリングします。各リンクには、
pageURL 変数が含まれています。
links生成された HTML は、
Bootstrap CSS フレームワークと互換性があることに注意してください。withPath
メソッドを使用すると、ページネーション リンクを生成するときに URI をカスタマイズできます。たとえば、
http://example.com/custom/url?page=Nのようなページ分割されたリンクを生成する場合は、
custom/urlパラメーターを渡すだけで済みます。 to
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() }}
ページネータ リンク ウィンドウの調整
ページネータの「ウィンドウ」の両側に表示される追加リンクの数を制御できます。デフォルトでは、メインのページネーション リンクの両側に 3 つのリンクが表示されます。この値は、
onEachSide
メソッドを使用して変更できます。{{ $users->onEachSide(5)->links() }}
結果を JSON
# に変換します。 ## Laravel ページネータ クラスは、Illuminate\Contracts\Support\Jsonable
インターフェイス コントラクトを実装し、ページング結果を JSON に簡単に変換できる
toJsonメソッドを提供します。ルートまたはコントローラー アクションからページネーター インスタンスを返すことによって、JSON に変換することもできます。
Route::get('users', function () { return App\User::paginate(); });
ページネーターからの JSON には、total
、
current_pageのようなものが含まれます。 、
last_pageおよびその他のメタデータ情報。実際の結果オブジェクトは、JSON 配列の
dataキーを介して提供されます。以下は、ルートからページネーター インスタンスを返すことによって 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":[ { // 结果集对象 }, { // 结果集对象 } ] }
Custom Pagination View デフォルトでは、ページ分割されたリンクを表示するためのビューのレンダリングは、Bootstrap CSS フレームワークと互換性があります。 Bootstrap を使用していない場合は、独自のビューを自由にカスタマイズしてこれらのリンクをレンダリングしてください。ページネータ インスタンスのlinks
メソッドを呼び出すときは、最初の引数としてビュー名を渡します。
{{ $paginator->links('view.name') }} // Passing data to the view... {{ $paginator->links('view.name', ['foo' => 'bar']) }}
ページ分割されたビューをカスタマイズする最も簡単な方法は、vendor を使用することです。 :publish
コマンドは、これらを
resources/views/vendorフォルダーに出力します。
php artisan vendor:publish --tag=laravel-pagination
このコマンドは、それらをresources/views/vendor/pagination## に出力します。 # フォルダー これらのビューを配置します。このフォルダーに組み込まれている
AppServiceProvider# のページャーのbootstrap-4.blade.php
ファイルは、デフォルトのページング ビューを提供します。このファイルを編集して、ページネーション HTML を変更できます。別のファイルをデフォルトのページング ビューとして定義する場合は、
defaultView
メソッドと
defaultSimpleViewメソッドを使用する必要があります。 ##:
use Illuminate\Pagination\Paginator;public function boot(){ Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name'); }
##
ページャー インスタンス メソッド
各ページャー インスタンスには、追加のページング情報を取得するための次のメソッドが用意されています::
#メソッド 説明 ##$results->count() 現在のページのデータ量を取得します。
$results->currentPage() 現在のページ番号を取得します。
$results->firstItem() 結果セット内の最初のデータの結果番号を取得します。
$results->getOptions() ポケットベルのオプションを取得します。
$results->getUrlRange($start, $end) ページ分割された URL 範囲を作成します。
$results->hasMorePages() 複数のページがあるかどうか。
$results->lastItem() 結果セット内の最後のデータ部分の結果番号を取得します。
$results->lastPage() simplePaginate最後のページのページ番号を取得します (
では無効です) )。 $results->nextPageUrl() 次のページの URL を取得します。
$results->onFirstPage() 最初のページかどうか。
$results->perPage() ページごとのデータ項目の数。
$results->previousPageUrl() 前のページの URL を取得します。
$results->total() simplePaginate合計データ (
では無効)。 $results->url($page)
指定されたページの URL を取得します。