Documents

Laravelのページネーション


ページネーション自体はchunkで分割して取得したデータを順次並べてゆくというものなので、特にLaravelの機能を使わなくともスクラッチで実装可能です。設計としては/sample/1みたいなエンドポイントに対して、/sample/n といった感じでページを振ってゆけば良さそうです。SQL自体はその分オフセットしてあげればよいというものになります。
しかしながらLaravelにはすでにその機能が全般的に備わっているので、それを使わない手はないということでその覚書となります。
Laravel 8.x Database:ペジネーション

他のフレームワークでは、ペジネーション(ページ付け)は非常に苦労することがあります。Laravelのペジネーションへのアプローチがが簡単であると思っていただけるよう願っています。LaravelのペジネーションはクエリビルダおよびEloquent ORMと統合されており、設定をしなくても便利で使いやすいペジネーションを提供します。

ページネーションの基本

usersテーブルのページネーションの最も単純なページネーションはこんな感じになります。

use Illuminate\Support\Facades\DB;

$users = DB::table('users')->paginate(15)
dd($users);

あるいはModelからオブジェクトで取得できます。

use App\Models\User;

$user = new User();
$users = $user->paginate(5);

pagenation()のメソッドはどちらでも使えるようになっているっぽいです。ただしjoinなどする際にはDB::table('TABLE_NAME')で取得しないとダメっぽいです。

Blade側で表示させるためには、これだけになります。

<div class="container">
    @foreach ($users as $user)
        {{ $user->name }}
    @endforeach
</div>

{{ $users->links() }}

これで5つのデータづつ分割されたデータの表示とページネーションができます。ここまでが基本です。しかし、{{ $users->links() }}ではデフォルトのリンクのHTMLセットがガバっと出てしまうので、自分でカスタマイズしたい場合は、

現在のページに表示されている件数: {{ $users->count() }}
現在のページ数: {{ $users->currentPage() }}
現在のページの最初の要素: {{ $users->firstItem() }}
次のページがあるかどうか: {{ $users->hasMorePages() }}
現在のページの最後の要素: {{ $users->lastItem() }}
最後のページ数: {{ $users->lastPage() }}
次のページのURL: {{ $users->nextPageUrl() }}
1ページに表示する件数: {{ $users->perPage() }}
前のページのURL: {{ $users->previousPageUrl() }}
合計件数: {{ $users->total() }}
指定ページのURL: {{ $users->url(4) }}

で、いろいろなパラメータがオブジェクトの中から拾えるので、これで作ります。
カーソルページングについては今度書きます。



2022.05.17