ホームページ >バックエンド開発 >PHPチュートリアル >[ Laravel 5.2 ドキュメント ] サービス -- ページネーション
他のフレームワークではページネーションは非常に面倒なものですが、Laravel ではそれが簡単に行えます。 Laravel は、現在のページに基づいて特定範囲のリンクをインテリジェントに生成でき、生成された HTML は Bootstrap CSS フレームワークと互換性があります。
2.1 クエリビルダーに基づくページネーション
ページングを実装するにはさまざまな方法がありますが、最も簡単な方法はクエリを使用することです。 builder または Eloquent モデルの paginate メソッド。このメソッドは、ユーザーが現在表示しているページに基づいて、適切なオフセットと制限を自動的に設定します。デフォルトでは、現在のページは HTTP リクエストのクエリ文字列パラメータ ?page の値によって決まります。もちろん、この値は Laravel によって自動的に検出され、ページネーターによって生成されたリンクに自動的に挿入されます。
まず、クエリで paginate メソッドを呼び出す方法を見てみましょう。この例では、paginate に渡される唯一のパラメータは、ページごとに表示する数値です。 ここでは、ページごとに 15 を指定します。 Laravel によって効果的に実行されます。ページ分割された結果で groupBy を使用する必要がある場合は、データベースに手動でクエリを実行してページネーターを作成することをお勧めします。
<?phpnamespace App\Http\Controllers;use 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]); }}
単純なページネーション
ページ分割されたビューで「次」と「前」のリンクを表示するだけの場合は、simplePaginate メソッドを使用してクエリを実行できます。大規模なデータセットを含むビューをレンダリングする場合に非常に便利で、各ページ番号を表示する必要はありません:
2.2 Eloquent モデルに基づくページネーション
Eloquent クエリ結果をページネーションすることもできます。この例では、User モデルをページ分割し、各ページに 15 件のレコードを表示します。ご覧のとおり、構文はクエリ ビルダー ベースのページネーションに似ています:
$users = DB::table('users')->simplePaginate(15);
もちろん、where 句などの他の制約を設定した後に paginate を呼び出すこともできます:
$users = App\User::paginate(15);simplePaginate メソッドも使用できます。
$users = User::where('votes', '>', 100)->paginate(15);2.3 ページネータを手動で作成する
配列データを渡してページネーション インスタンスを手動で作成したい場合があります。独自のニーズは、IlluminatePaginationPaginator または IlluminatePaginationLengthAwarePaginator インスタンスを作成することで実現されます。
$users = User::where('votes', '>', 100)->simplePaginate(15);
Paginator クラスは結果セット内のデータ項目の総数を知る必要はありません。このため、このクラスは最後のページのインデックスを取得するメソッドを提供しません。
LengthAwarePaginator は、結果セットの総数を渡す必要があることを除いて、Paginator とほぼ同じパラメーターを受け取ります。
つまり、Paginator は simplePaginate メソッドに相当し、LengthAwarePaginator は paginate メソッドに相当します。
ページャー インスタンスを手動で作成する場合は、ページャーに渡される結果セットを手動で「スライス」する必要があります。これを行う方法がわからない場合は、PHP 関数 array_slice を確認してください。
3. ページネーションの結果をビューに表示します
links メソッドは、結果セット内の他のページ リンクをレンダリングします。各リンクには、?page クエリ文字列変数がすでに含まれています。 render メソッドによって生成された HTML は、Bootstrap CSS フレームワークと互換性があることに注意してください。
<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach</div>{!! $users->links() !!}注: Blade テンプレートから render メソッドを呼び出すときは、HTML リンクがフィルタリングされないように、必ず {!! !!} 構文を使用してください。
カスタム ページネーション リンク
たとえば、ページネーション リンクを生成するときに、ページネーションで使用される URI をカスタマイズできます。 :// example.com/custom/url?page=N のようなリンクの場合、custom/url を setPath メソッドに渡す必要があります:
ページング リンクにパラメータを追加します
appends メソッドを使用して、ページネーション リンク クエリ文字列にクエリ パラメータを追加できます。たとえば、&sort=votes を各ページング リンクに追加するには、次のように appends を呼び出します。
Route::get('users', function () { $users = App\User::paginate(15); $users->setPath('custom/url'); //});
ページング リンクに「ハッシュ フラグメント」を追加したい場合は、フラグメント メソッドを使用できます。たとえば、各ページネーション リンクの末尾に #foo を追加するには、次のようにフラグメント メソッドを呼び出します。
{!! $users->appends(['sort' => 'votes'])->links() !!}その他のヘルパー メソッド
ページネーターで次のメソッドを渡すこともできます。インスタンス 詳細なページネーション情報にアクセスします:
{!! $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 } ]}