Bayangkan kamu masuk ke perpustakaan besar — dan semua 50.000 buku dijejalkan ke satu meja. Kacau, kan? Nah, itulah yang terjadi kalau kamu nampilkan ribuan data sekaligus tanpa pagination. Lambat, berat, dan penggunanya kabur. Di artikel ke-27 dari seri 50 Artikel Belajar Laravel ini, kita bakal belajar cara bikin pagination yang rapi dan elegan. Topik ini juga relevan banget buat kamu yang sedang membangun fitur manajemen user dengan sistem autentikasi Laravel Breeze — karena list user butuh pagination!
Tenang, Laravel sudah menyiapkan senjata pagination yang powerful banget — tinggal pakai, dan hasilnya langsung kece. Yuk, kita bedah tuntas dari dasar sampai advanced!
Pagination adalah teknik membagi dataset besar menjadi beberapa halaman kecil yang bisa dinavigasi pengguna. Di Laravel, mekanisme ini didukung secara native oleh Eloquent ORM dan Query Builder, sehingga implementasinya cukup satu baris kode: ->paginate(10).
1. Kenapa Pagination Itu Wajib? (Bukan Sekedar Fitur Opsional)
Sebelum kita koding, penting banget untuk paham why-nya dulu. Coba bayangkan aplikasi manajemen artikel blog dengan 10.000 post. Kalau kamu pakai ->get() biasa, maka:
Google merekomendasikan waktu load halaman di bawah 3 detik. Halaman yang memuat 10.000 record sekaligus bisa mencapai 10–30 detik. Dengan pagination 15 item per halaman, waktu load bisa turun drastis ke bawah 1 detik!
2. Tiga Jenis Pagination di Laravel — Pilih yang Tepat!
Laravel tidak hanya punya satu cara pagination — ada tiga metode dengan karakteristik berbeda. Di project yang menggunakan autentikasi Laravel Breeze, kamu paling sering butuh metode pertama dan kedua. Berikut penjelasannya:
3. Implementasi Pagination Laravel: Step-by-Step
Oke, sekarang waktunya coding! Kita akan buat fitur daftar artikel (posts) dengan pagination. Ini adalah skenario paling umum di project Laravel, termasuk yang sudah dilengkapi autentikasi Laravel Breeze.
Siapkan Model & Migrasi
Pastikan kamu sudah punya model Post. Kalau belum, jalankan perintah berikut:
$ php artisan make:model Post -m
Update Controller dengan paginate()
Buka PostController.php dan ubah method index():
<?php namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function index() { // Ambil 10 post per halaman, urut terbaru $posts = Post::latest()->paginate(10); return view('posts.index', compact('posts')); } }
Kamu bisa chain method lain sebelum paginate() seperti biasa! Contoh: Post::where('status', 'published')->latest()->paginate(10) — filter dan pagination bekerja bersamaan tanpa masalah.
Tampilkan di Blade View
Di file resources/views/posts/index.blade.php:
<!-- Loop semua post --> @foreach ($posts as $post) <div class="card mb-3"> <h5>{{ $post->title }}</h5> <p>{{ $post->excerpt }}</p> </div> @endforeach <!-- Tombol Navigasi Halaman (Magic! ✨) --> {{ $posts->links() }}
Aktifkan Bootstrap Pagination (AppServiceProvider)
Secara default, $posts->links() menggunakan Tailwind CSS. Kalau project kamu pakai Bootstrap (umum di proyek yang menggunakan Breeze), tambahkan ini di AppServiceProvider.php:
use Illuminate\Pagination\Paginator; public function boot(): void { // Pilih tampilan Bootstrap atau Tailwind Paginator::useBootstrapFive(); // Bootstrap 5 // ATAU: // Paginator::useTailwind(); // Untuk Tailwind CSS }
Project yang sudah setup autentikasi Laravel Breeze biasanya pakai Tailwind CSS secara default. Jadi cukup gunakan Paginator::useTailwind() dan pagination kamu langsung tampil cantik sesuai theme Breeze tanpa CSS tambahan!
Custom Pagination View (Opsional tapi Keren)
Ingin tampilan pagination yang fully custom? Publish view-nya dan edit sesuka hati:
# Publish semua pagination views $ php artisan vendor:publish --tag=laravel-pagination # View akan tersedia di: # resources/views/vendor/pagination/
Lalu di Blade, panggil custom view spesifik: {{ $posts->links('vendor.pagination.custom') }}
4. Pagination Lanjutan: Filter, Search & URL Parameter
Di dunia nyata, pagination sering dikombinasikan dengan fitur search dan filter. Masalah umum: setelah filter data, pindah halaman malah kehilangan parameter filter. Solusinya adalah ->withQueryString()!
public function index(Request $request) { $query = Post::latest(); // Filter berdasarkan kata kunci search if ($request->filled('search')) { $query->where('title', 'like', '%' . $request->search . '%'); } // Pagination + pertahankan query string (?search=...) $posts = $query->paginate(10)->withQueryString(); return view('posts.index', compact('posts')); }
Selalu gunakan ->withQueryString() saat menggabungkan pagination dengan filter/search. Tanpa ini, saat user klik halaman 2, semua parameter filter akan hilang — pengalaman yang sangat frustasi!
Saat return dari controller API, cukup return response()->json($posts->paginate(10)) — Laravel otomatis membungkus data dengan metadata lengkap: current_page, total, last_page, next_page_url, dan lainnya. Siap dikonsumsi frontend manapun!
Tags Artikel:
No comments:
Post a Comment