Menjaga Filter Pencarian saat Pagination di Laravel
Bangun daftar artikel dengan pencarian judul, urutan konsisten, dan tautan halaman yang mempertahankan kata kunci.
Pengguna mencari artikel, berpindah ke halaman kedua, lalu hasil pencarian hilang. Penyebab yang sering terjadi adalah parameter filter tidak ikut masuk ke tautan pagination.
Contoh ini memakai parameter q untuk judul dan hanya menampilkan artikel yang sudah terbit. Gunakan query builder untuk membentuk kondisi sebelum memanggil paginate. Nama view dan route dapat disesuaikan dengan aplikasi Anda.
Contoh implementasi
public function index(\Illuminate\Http\Request $request)
{
$data = $request->validate(['q' => ['nullable', 'string', 'max:100']]);
$query = trim($data['q'] ?? '');
$posts = \App\Models\Post::query()
->whereNotNull('published_at')
->where('published_at', '<=', now())
->when($query !== '', fn ($builder) =>
$builder->where('title', 'like', '%'.$query.'%'))
->orderByDesc('published_at')
->orderByDesc('id')
->paginate(10)
->appends(['q' => $query]);
return view('articles.index', compact('posts', 'query'));
}
<form method="get">
<label for="query">Search articles</label>
<input id="query" name="q" value="{{ $query }}">
<button>Search</button>
</form>
@foreach ($posts as $post)
<h2>{{ $post->title }}</h2>
@endforeach
{{ $posts->links() }}
Cara memeriksa
Siapkan lebih dari sepuluh artikel yang judulnya cocok dengan kata kunci. Buka halaman kedua dan pastikan URL tetap memuat q. Lakukan pencarian baru melalui form; karena form tidak mengirim nomor halaman, pencarian kembali dimulai dari halaman pertama.
Urutan kedua berdasarkan id membantu ketika beberapa artikel memiliki waktu terbit sama. Contoh menggunakan semantik SQL LIKE: % dan _ di input berperan sebagai wildcard. Jika produk membutuhkan pencarian literal, tambahkan mekanisme escape yang sesuai database. Pencarian %kata% pada data besar juga perlu dievaluasi dengan strategi indeks atau mesin pencarian.
