Laravelでは用意されている関数を使うことで簡単にページネーションが可能です。
```php
$model = Model::paginate(10);
return view('index', [
'model' => $model,
]);
```
サーバ側で取得したいモデルに対して`paginate()`を呼び出し、引数に1ページあたりに取得したい件数を入れます。
[データベース:ペジネーション 5.8 Laravel](https://readouble.com/laravel/5.8/ja/pagination.html)
`paginate()`を使うと、フロント側で`link()`関数が使えるようになります。これを*.blade.phpで呼び出すことで、bootstrapのクラスが付与されたナビゲーションが描画されます。
```php
{{ $model->links() }}
```
[Pagination · Bootstrap](https://getbootstrap.com/docs/4.0/components/pagination/)
## 検索結果をページネーションする
単純に取得した結果を条件に沿って絞るにはCollectionのfilterを使えばよいのですが、これではpaginateに対応することができないため、クエリビルダを使います。
例えばクエリパラメータでhogeがnameに含まれるという条件がクエリで渡されたとき、サーバ側では以下のようにします。
```php
$model = new Model();
if (request->has('name')) {
$model = $model->where('name', 'LIKE', "%$request->name%");
}
return view('index', [
'model' => $model->paginate(10),
]);
```
クエリに値が渡されていなかったときエラーを回避するためにリクエストをチェックし、絞り込みを行います。
この方法であれば複数の条件が渡されていっても、条件に関係ないものは実行されずに最終的に条件に当てはまり、かつ1ページあたり10件を返すということができます。
検索条件を追加した場合`{{ $model->links() }}`だけでは不十分で、ページ遷移を行ったときに検索条件がクエリから取り除かれてしまいます。
そのため検索条件を保持したままページネーションを行うには`{{ $model->appends(request()->query)->links() }}`のようにクエリを足します。
この場合全てのクエリを渡しますが、appedns()の引数は配列なので必要なものだけを渡すことも可能です。