
Pendahuluan
Bayangin lagi ngerjain fitur sederhana, tapi tiba-tiba klien minta filter data yang kondisinya ribet banget: harus bisa filter berdasarkan range tanggal, kategori, status, sampai pencarian teks yang dinamis. Awalnya mungkin kita bakal nulis tumpukan if-else yang bikin Controller jadi 'gemuk' dan sulit dibaca. Saya sering lihat pola ini di project yang mulai berkembang, di mana kode jadi susah di-maintain karena logika filternya nyampur sama logika request.
Tips & Best Practices
Di banyak project, biasanya saya mulai dari memisahkan logika filtering ke dalam scope model supaya Controller tetap bersih. Pertama, gunakan Query Scopes biar logika filter bisa dipakai ulang. Kedua, selalu manfaatkan when() agar kita nggak perlu capek-capek ngecek apakah input itu ada atau kosong. Ketiga, saya selalu membiasakan diri untuk memvalidasi input di form request sebelum menyentuh query builder, supaya nggak ada query sampah yang masuk ke database.
Contoh Kode
Berikut cara saya membungkus logika filter agar enak dilihat dan rapi:
public function scopeFilter($query, array $filters) { return $query->when($filters['search'] ?? null, function ($query, $search) { $query->where('title', 'like', '%' . $search . '%'); })->when($filters['category_id'] ?? null, function ($query, $id) { $query->where('category_id', $id); }); }Variasi Implementasi
Kalau filternya makin liar, kadang saya beralih ke Pipeline Pattern. Ini cocok kalau filternya ada banyak banget dan tiap filter punya logika unik. Tapi, kalau cuma filter standar, Query Builder dengan when() sudah jauh lebih dari cukup dan nggak bikin overhead. Jangan buru-buru pake package pihak ketiga kalau fitur native Laravel udah bisa cover dengan rapi.
Kesalahan Umum
Pertama, seringkali kita lupa nge-sanitize input, akhirnya malah kena SQL Injection. Kedua, menulis logika query langsung di Controller yang bikin unit testing jadi mimpi buruk. Ketiga, membiarkan query tanpa index di database pas filternya dipake di tabel jutaan baris. Keempat, lupa pakai when() dan malah nulis if($request->has) berulang kali yang bikin kode kelihatan 'kotor'. Terakhir, mengabaikan performa dengan memuat semua data sekaligus (lupa pakai paginate()) saat fitur filter dijalankan.
Ringkasan
Bikin fitur filter itu seni menyeimbangkan antara keterbacaan kode dan performa query. Kuncinya bukan cuma soal sintaks, tapi gimana kita bisa bikin kode yang pas kita buka lagi enam bulan ke depan, kita nggak bakal ngedumel sendiri. Tetaplah jaga Controller tetap tipis, dan biarkan Model atau Pipeline yang bekerja keras di balik layar.
Komentar
Posting Komentar