他のフレームワークでは、通常、ページネーションはもっと面倒です。 laravelを使うととても簡単になります。 Laravel は、現在のページに基づいてインテリジェントな範囲リンクを迅速に生成でき、生成される HTML は Bootstrap CSS フレームワークと互換性があります。
要素をページ分割するにはいくつかの方法があります。最も簡単な方法は、クエリ ビルダーまたは Eloquent クエリの paginate メソッドを使用することです。 paginate メソッドは、現在のユーザーが訪問している現在のページに基づいて、正しいディスプレイスメントと表示範囲を自動的に設定します。デフォルトでは、現在のページは HTTP リクエストのクエリ文字列 ?page を通じて自動的に取得されます。もちろん、Laravel はこの値を自動的に検出し、生成されたページネーター リンクに適切な値を自動的に挿入します。
まず、クエリ内での paginate メソッドの呼び出しを見てみましょう。この例では、paginate メソッドでページごとのインプレッション数を渡すだけで済みます。ページごとの表示数を 15 に設定しましょう:
<?phpnamespace App\Http\Controllers;use 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]); }}
注: 現在、laravel で groupBy 構文を使用すると、ページング操作を正しく実行できません。 groupBy を使用して結果をページ分割する必要がある場合は、クエリを実行して手動でページ分割することをお勧めします。
単純なページネーション
「前のページ」と「次のページ」リンクを単に表示するだけの場合は、simplePaginate メソッドを使用して有効なクエリを実行することを選択できます。これは、ビュー内の各ページのリンクを表示する必要がない場合に、一部の大規模なデータベースで非常に効果的です。
$user = DB::table('users')->simplePaginate(15);
Eloquent の結果をページ分割する
Eloquent クエリの結果をページ分割することもできます。 User モデルをページ分割して、1 ページに 15 個のアイテムを表示しましょう。構文は、ページネーションにクエリ ビルダーを使用する場合とよく似ています:
$users = App\User::paginate(15);
もちろん、ページネーションの前に他のクエリを優先することもできます:
$users = User::where('votes', '>', 100)->paginate(15);
Eloquent モデルをページネーションするときに simplePaginate メソッドを使用することもできます:
$user = User::where('votes', '>', 100)->simplePaginate(15);
場合によっては、Paginator インスタンスを手動で作成し、項目の配列を渡す必要がある場合があります。ニーズに応じて、IlluminatePaginationPaginator インスタンスまたは IlluminatePaginationLengthAwarePaginator インスタンスを作成できます。
Paginator クラスは、結果内の項目の合計数を知る必要はありません。実際、まさにこのため、このクラスは最後のページを取得するメソッドを提供しません。 LengthAwarePaginator は Paginator に似ており、ほぼ同じパラメータを受け入れます。ただし、結果に項目の合計数が含まれる必要があります。
一方、PaginatorはEloquentのクエリビルダーとsimplePaginateメソッドに相当します。そして、LengthAwarePaginator が paginate メソッドに相当します。
ページャー インスタンスを手動で作成する場合は、ページャーに渡された結果を手動でスライスする必要があります。スライス方法がわからない場合は、PHP の array_slice メソッドを確認してください。
クエリビルダーまたはEloquentクエリでpaginateメソッドまたはsimplePaginateメソッドを使用すると、ページネーターのインスタンスを取得できます。 paginate メソッドが呼び出されると、IlluminatePaginationLengthAwarePaginator インスタンスが取得されます。 simplePaginate メソッドが呼び出されると、IlluminatePaginationPaginator インスタンスが取得されます。これらのオブジェクトは、結果セットを記述するためのさまざまなメソッドを提供します。これらのヘルパー メソッドに加えて、ページャー自体も反復子であり、配列のようにループできます。
したがって、ページ分割された結果を取得したら、次のように Blade ビューでページ分割されたリンクを表示および生成できます:
<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach</div>{{ $users->links() }}
links メソッドは、結果セットに基づいてページ分割された結果を生成します。 ?page クエリ変数は、すべてのリンクに自動的に含まれます。 links メソッドを使用して生成された HTML は、Bootstrap CSS フレームワークと互換性があります。
カスタム ページネーター URL
setPath メソッドを使用すると、ページネーターによって生成されるリンクの URI をカスタマイズできます。たとえば、ページネーターに http://example.com/custom/url?page=N のようなものを生成させたい場合は、custom/url を setPath メソッドに渡すことができます:
Route::get('users', function () { $users = App\User::paginate(15); $users->setPath('custom/url');});
クエリ文字列をページネーターに追加します。 link
appends メソッドを使用して、クエリ文字列をページネータ リンクに追加できます。たとえば、&sort=votes クエリ文字列をページネータ リンクに追加します。次のように appends メソッドを呼び出すことができます:
{{ $users->appends(['sort' => 'votes'])->links() }}
ページャーの URL にハッシュ フラグメントを追加する必要がある場合は、fragment メソッドを使用できます。たとえば、ページネーション リンクに #foo を追加します。
{{ $users->fragment('foo')->links() }}
その他のヘルパー メソッド
ページネータ インスタンスで次のメソッドを呼び出して、追加のページネータ情報にアクセスできます:
laravel 的分页器类实现了 Illuminate\Contracts\Support\JsonableInterface 契约并且暴露了 toJson 方法,所以它可以非常简单的将分页结果转换为 JSON 格式。
你也可以在路由或者控制器动作中简单的返回分页器实例来进行 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, "next_page_url": "http://laravel.app?page=2", "prev_page_url": null, "from": 1, "to": 15, "data":[ { // Result Object }, { // Result Object } ]}