Laravelで検索結果の一覧表示画面にページネーションを実装する方法と、デザインをカスタマイズする方法の個人的な備忘録。
環境
PHP 8.1
Laravel 9
ページネーションの実装
まずはModelからデータを取得してViewにページネーションを表示するまで。
データ取得
今回はトピックの一覧を表示する画面を作成したので、Topicsモデルからデータを取得する。
1ページあたりの表示件数は10件とした。
public function getTopics(): LengthAwarePaginator
{
return Topic::paginate(10);
}
取得時のwhere条件や並び替えなどがあれば適宜追加する。
viewへの表示
続いて取得したデータを表示するbladeファイル。
@foreach ($topics as $key => $topic)
<div>
{{ $topic->title }}
</div>
@endforeach
<!-- ページネーション用のリンクボタン -->
{{ $topics->links }}
これで取得したトピックのタイトルを一覧表示する画面にページネーションが実装できた。とても簡単。
が、これだけではデザインが大きく崩れたいた。どうやらBootstrapのデザインが適用されていなかったようで・・・。
Bootstrapデザインの適用
Bootstrapのデザインを適用させるにはAppServiceProviderに記述を追加する必要がある。
<?php
// app\Providers\AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrap(); // これを追記する。
}
}
これでBootstrapのデザインが適用され、とりあえず見た目だけは綺麗になった。
デザインのカスタマイズ
画面デザインに合わせてページネーションのボタンのデザインも変更する必要があったので、カスタマイズしてみた。
まずは以下のコマンドを実行する。
php artisan vendor:publish --tag=laravel-pagination
すると resources/views/vendor/pagination
ディレクトリが作成され、この中にページネーションのbladeファイルが色々作成される。
この中に独自デザインのページネーション用bladeファイルを作成する。
今回はデフォルトで用意されているdefault.blade.php
をコピーして新たにtopics.blade.php
を作成し、このbladeファイルを色々編集してデザインを変更した。
一つ前のページへのリンク、一つ後のページへのリンクなどもここで記述されているので、見た目だけでなく細かい挙動などをカスタマイズすることもできた。
無事カスタムページネーションのbladeファイルができたら今度はこれを元のbladeファイルに反映する。
<!-- ページネーション用のボタン -->
<!-- {{ $topics->links }} -->
{{ $topics->links('vendor.pagination.topics' }}
ページネーション用のボタンを上記のように変更する。反映させるbladeファイルを単純に指定するだけなので簡単にカスタムページネーションを反映させることができた。
また、今回は各ページに「〇〇~〇〇件 / (全体数)件」を表記してほしいとのことだったが、こちらもページネーションの機能で簡単に実装できた。
<!-- 画面表示されている項目の最初の連番 -->
{{ $topics->firstItem() }}
<!-- 画面表示されている項目の最後の連番 -->
{{ $topics->lastItem() }}
<!-- 全件数 -->
{{ $topics->total() }}
これで「11~20件 / 50件」みたいな件数の表示が実現できた。
参考文献
・Laravel8でページネーション(Pagination)を実装する方法
Bootstrapの適用方法で参考になりました。
https://leben.mobi/blog/laravel8_pagination/php/