カテゴリー
Laravel
投稿日時
2018-04-27 13:27:37
今回はLaravelのページネーション機能の仕組みについて簡単に紹介したいと思います。
例えば、商品の情報を全部いっぺんに商品一覧に表示するには商品の数が多いので、とりあえず20件ずつ表示することを考えます。
使い方としては、クエリビルダーもしくはEloquentで生成したクエリにget()でなくpaginate($count)($countは1ページあたりの件数)で結果を取得すればいいだけです。
```クエリビルダー
$items = DB::table('item')->paginate(20);
```
```Eloquent
$items = App\Item::paginate(20);
```
もちろん、どちらの場合もpaginateメソッドで結果を取得する前にwhereで絞り込んだりorderByで並び替えたりできます(groupByについてはどうもうまくいかないらしい)。
で、paginateで取得したものの正体ですが、**LengthAwarePaginator**オブジェクトというものになります。LengthAwarePaginatorオブジェクトとは何かというと、詳しくはソース(Laravelのプロジェクトフォルダのvendor/laravel/framework/src/Illuminate/Pagination/LengthAwarePaginator.php)を見てもらうしかないのですが、例えば
```
dd(App\Item::paginate(20)->toJson());
```
のように[Json形式](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)に変換して表示してみると、
```
{
"total": 100,
"per_page": 20,
"current_page": 2,
"last_page": 5,
"next_page_url": "http://example.com/item?page=3”,
"prev_page_url": "http://example.com/item?page=1”,
"from": 21,
"to": 40,
"data":[
{そのページが実際に持っているデータをJson形式にしたもの}
]
}
```
こんな感じで検索結果全体のデータ数(total)や前後のページのURL(prev_page_url,next_page_url)、現在のページ(current_page)や総ページ数(last_page)、1ページあたりのデータ数(per_page)、そのページの最初と最後のデータ番号(from,to)なんかを持っていることがわかります。
また、LengthAwarePaginatorはこれらの情報を取得するメソッドを持っています。
例えば、$items->nextPageUrl()とすると、next_page_urlが取得できます。詳しくは[こちら](https://readouble.com/laravel/5.5/ja/pagination.html#paginator-instance-methods)を参照して下さい。
ちなみに、検索条件などのパラメータを保持させたいときは、
```
$params["type"] = "fruits";
$params["year"] = 2018;
App\Item::paginate(20)->appends($params);
```
のようにappendメソッドでパラメータが入った連想配列を渡せば、
```
http://example.com/item?page=1&type=fruits&year=2018
```
という風にURLにパラメータを渡すことができます。
結果をBladeで表示するときはgetで取得した時のように
```
@foreach ($items as $item)
{{ $item->name }}
@endforeach
```
で(該当ページの)結果一覧を取得できます。ただし、paginate($page)の結果は[コレクション](https://readouble.com/laravel/5.5/ja/collections.html) (get()で取得できるもの)とは違うので、コレクション用のメソッドは使用しないでください。
別のページに飛ぶリンクは
```
{!! $item->links() !!}
```
もしくは
```
{!! $item->render() !!}
```
とすると、

こういうのが表示されます。ちなみにこのページネーションリンクはデフォルトではBootstrapのCSSで作られたものですが、カスタマイズすることもできるそうです。
一見簡単に見えて奥が深いページネーション、是非とも使いこなせるようにしたいですね。