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 halaman
  • simplePaginate(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.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.