Tutorial Laravel #23: Pagination di Laravel
1. Apa itu Pagination?
Pagination membagi data yang banyak menjadi beberapa halaman agar tampilan lebih ringan dan mudah dinavigasi. Laravel menyediakan pagination yang sudah terintegrasi penuh dengan Eloquent dan Query Builder - bisa dipakai dengan sangat mudah.
2. Pagination Dasar
// paginate() - paling sering dipakai
public function index()
{
$artikels = Artikel::latest()->paginate(10); // 10 item per halaman
return view('artikel.index', compact('artikels'));
}
// simplePaginate() - hanya tombol prev/next (lebih ringan untuk data besar)
$artikels = Artikel::latest()->simplePaginate(10);
// cursorPaginate() - berbasis cursor (paling efisien untuk data sangat besar)
$artikels = Artikel::latest()->cursorPaginate(10);
3. Tampilkan Pagination di Blade
@extends('layouts.app')
@section('content')
<div class="d-flex justify-content-between mb-3">
<h1>Artikel</h1>
<p class="text-muted">Total: {{ $artikels->total() }} artikel</p>
</div>
@forelse($artikels as $artikel)
<div class="card mb-3">
<div class="card-body">
<h5>{{ $artikel->judul }}</h5>
<small class="text-muted">{{ $artikel->created_at->diffForHumans() }}</small>
</div>
</div>
@empty
<p>Belum ada artikel.</p>
@endforelse
{{-- Render tombol pagination --}}
<div class="d-flex justify-content-center">
{{ $artikels->links() }}
</div>
<p class="text-center text-muted">
Halaman {{ $artikels->currentPage() }} dari {{ $artikels->lastPage() }}
</p>
@endsection
4. Styling Pagination dengan Bootstrap
// app/Providers/AppServiceProvider.php
use IlluminatePaginationPaginator;
public function boot(): void
{
Paginator::useBootstrapFive(); // pakai Bootstrap 5
// Paginator::useBootstrapFour(); // Bootstrap 4
// Paginator::useTailwind(); // Tailwind CSS
}
5. Pagination dengan Query Filter
public function index(Request $request)
{
$query = Artikel::query()->with('user', 'kategori');
// Filter pencarian
if ($request->filled('cari')) {
$query->where('judul', 'like', '%' . $request->cari . '%');
}
// Filter status
if ($request->filled('status')) {
$query->where('status', $request->status);
}
// Filter kategori
if ($request->filled('kategori')) {
$query->where('kategori_id', $request->kategori);
}
// withQueryString() penting! agar parameter filter ikut di link pagination
$artikels = $query->latest()->paginate(10)->withQueryString();
return view('artikel.index', compact('artikels'));
}
<!-- Form filter -->
<form method="GET">
<input type="text" name="cari" value="{{ request('cari') }}" placeholder="Cari judul...">
<select name="status">
<option value="">Semua Status</option>
<option value="published" {{ request('status') == 'published' ? 'selected' : '' }}>Published</option>
<option value="draft" {{ request('status') == 'draft' ? 'selected' : '' }}>Draft</option>
</select>
<button type="submit">Filter</button>
<a href="{{ route('artikel.index') }}">Reset</a>
</form>
6. Method Pagination yang Berguna
$artikels->total() // total semua data
$artikels->count() // jumlah data di halaman ini
$artikels->perPage() // jumlah item per halaman
$artikels->currentPage() // halaman saat ini
$artikels->lastPage() // halaman terakhir
$artikels->hasMorePages() // masih ada halaman berikutnya?
$artikels->firstItem() // nomor item pertama di halaman ini
$artikels->lastItem() // nomor item terakhir di halaman ini
$artikels->links() // render navigasi pagination
$artikels->url(1) // URL halaman 1
$artikels->nextPageUrl() // URL halaman berikutnya
$artikels->previousPageUrl() // URL halaman sebelumnya
7. Ringkasan
paginate(n)untuk pagination standar dengan nomor halamansimplePaginate(n)untuk prev/next saja - lebih efisien- Tampilkan navigasi di Blade dengan
{{ $data->links() }} - Gunakan
->withQueryString()agar parameter filter ikut saat ganti halaman
Tutorial berikutnya membahas accessor, mutator, dan casts di Laravel.
.jpg)
