コメントの件数が増加したときには,すべてのコメントを一度に表示することは考えられず,例えば10件ごとにページを分けて表示するというページネーションの機能が必須になります.Laravel ではこのページネーションを非常に簡単に実装することができます.
ページネーションで5件の結果だけを取得するには,コントローラにおいてこれまで get()
で全件を取得していたところで paginate(5)
と指定するだけです.これだけで,5件に限定するだけでなく,ページの切り替えなどもにもすでに実現できています.
app/HTTP/Controllers/CommentsController.php(抜粋)
public function index()
{
$comments = Comment::paginate(5);
return view('comments.index')
->with('comments', $comments);
}
これにより先頭の5件のデータだけが表示されるようになりました.
次に,ページの切り替えのためのリンクを設置します.これも非常に簡単で,viewに {{ $comments->links() }}
を追加するだけです.
resources/views/comments/index.blade.php(抜粋)
<h1 class="my-5">コメント一覧</h1>
<div>
{{ $comments->links() }}
</div>
@foreach ($comments as $comment)
<div class="card mb-3">
<div class="card-body">
<h5 class="card-title">
<a href="{{ route('comments.show', ['comment_id' => $comment->id]) }}">
{{ $comment->title }}
</a>
</h5>
<p class="card-text">{{ $comment->body }}</p>
</div>
</div>
@endforeach
しかしながら,ページ切り替えのボタンのデザインが崩れてしまいます.
これは,Laravel 10 では標準のスタイルシートのセットが Tailwind CSS であるのに対して,今は Bootstrap を利用していることが原因です.全体を Tailwind CSS に切り替える方法もありますが,ここでは,app/Providers/AppServiceProvider.php を修正して,Bootstrap に対応させるようにします.まず,app/Providers/AppServiceProvider.php は次のような内容になっているはずです.
app/Providers/AppServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
//
}
}
これを次のように書き換えます.
app/Providers/AppServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Paginator::useBootstrap();
}
}
この設定でページ切り替えのためのボタンのデザインが美しく整えられました.
2ページ目に移動した状態です.
最後の20ページ目にも移動できます.このとき,次のページへ移動するボタンが自動的に無効化されていることにも注意してください.