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