Laravel menyediakan Query Builder yang elegan dan intuitif untuk operasi database. Salah satu fitur paling sering digunakan adalah berbagai metode "where" untuk memfilter data. Artikel ini akan membahas secara komprehensif berbagai varian where di Laravel, termasuk where, whereNot, whereLike, dan banyak lagi.
Dasar-dasar Where di Laravel
Metode where()
adalah fondasi dari filtering data di Laravel. Mari kita mulai dengan sintaks dasarnya:
1. Where Dasar
// Format dasar
$users = DB::table('users')
->where('status', 'active')
->get();
// Dengan operator perbandingan
$users = DB::table('users')
->where('age', '>=', 18)
->get();
// Dengan model Eloquent
$users = User::where('status', 'active')->get();
Operator yang bisa digunakan:
=
(default jika tidak disebutkan)<
(kurang dari)<=
(kurang dari atau sama dengan)>
(lebih dari)>=
(lebih dari atau sama dengan)<>
atau!=
(tidak sama dengan)like
(untuk pencarian pattern)
2. Where dengan Array
Kamu bisa menggabungkan beberapa kondisi where dengan array:
$users = DB::table('users')
->where([
['status', 'active'],
['age', '>=', 18],
['subscription', 'premium'],
])
->get();
Tips
Semua kondisi dalam array where akan digabungkan dengan operator AND. Jika kamu membutuhkan operator OR, gunakan metode orWhere()
.
Varian Where Lanjutan
1. whereNot dan whereNotIn
Untuk menolak nilai tertentu, gunakan whereNot
(Laravel 10+) atau where
dengan operator !=
:
// Laravel 10+
$users = DB::table('users')
->whereNot('status', 'inactive')
->get();
// Versi sebelumnya
$users = DB::table('users')
->where('status', '!=', 'inactive')
->get();
// Menolak beberapa nilai
$users = DB::table('users')
->whereNotIn('id', [1, 2, 3])
->get();
2. whereLike dan whereNotLike
Untuk pencarian dengan pattern, gunakan operator like
atau metode whereLike
(jika menggunakan package tambahan):
// Menggunakan operator like
$users = DB::table('users')
->where('name', 'like', '%john%')
->get();
// Pencarian case-insensitive (MySQL)
$users = DB::table('users')
->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%'])
->get();
// Tidak mengandung pattern
$users = DB::table('users')
->where('name', 'not like', '%admin%')
->get();
Perhatian
Operator like
bersifat case-sensitive atau case-insensitive tergantung pada konfigurasi database. Untuk konsistensi, gunakan whereRaw
dengan LOWER()
seperti contoh di atas.
3. whereBetween dan whereNotBetween
Untuk mencari nilai dalam rentang tertentu:
// Nilai dalam rentang
$users = DB::table('users')
->whereBetween('age', [18, 65])
->get();
// Nilai di luar rentang
$users = DB::table('users')
->whereNotBetween('age', [18, 65])
->get();
4. whereIn dan whereNotIn
Untuk mencari nilai yang ada dalam array:
// Nilai dalam array
$users = DB::table('users')
->whereIn('id', [1, 2, 3])
->get();
// Nilai tidak dalam array
$users = DB::table('users')
->whereNotIn('id', [1, 2, 3])
->get();
// Dengan subquery
$users = DB::table('users')
->whereIn('id', function ($query) {
$query->select('user_id')
->from('orders')
->where('status', 'completed');
})
->get();
5. whereNull dan whereNotNull
Untuk mencari nilai NULL atau tidak NULL:
// Kolom dengan nilai NULL
$users = DB::table('users')
->whereNull('deleted_at')
->get();
// Kolom dengan nilai tidak NULL
$users = DB::table('users')
->whereNotNull('email_verified_at')
->get();
6. whereDate, whereMonth, whereDay, whereYear, whereTime
Untuk filter berdasarkan komponen tanggal dan waktu:
// Filter berdasarkan tanggal
$users = DB::table('users')
->whereDate('created_at', '2023-01-01')
->get();
// Filter berdasarkan bulan
$users = DB::table('users')
->whereMonth('created_at', '12')
->get();
// Filter berdasarkan hari
$users = DB::table('users')
->whereDay('created_at', '31')
->get();
// Filter berdasarkan tahun
$users = DB::table('users')
->whereYear('created_at', '2023')
->get();
// Filter berdasarkan waktu
$users = DB::table('users')
->whereTime('created_at', '>', '12:00:00')
->get();
Menggabungkan Beberapa Kondisi Where
1. Kondisi AND
Secara default, beberapa where akan digabungkan dengan AND:
$users = DB::table('users')
->where('status', 'active')
->where('age', '>=', 18)
->get();
// SQL yang dihasilkan:
// SELECT * FROM users WHERE status = 'active' AND age >= 18
2. Kondisi OR
Gunakan orWhere
untuk kondisi OR:
$users = DB::table('users')
->where('status', 'active')
->orWhere('is_admin', true)
->get();
// SQL yang dihasilkan:
// SELECT * FROM users WHERE status = 'active' OR is_admin = 1
3. Pengelompokan Kondisi (Where dengan Closure)
Untuk kondisi yang lebih kompleks, gunakan closure:
$users = DB::table('users')
->where('status', 'active')
->where(function ($query) {
$query->where('role', 'admin')
->orWhere('role', 'editor');
})
->get();
// SQL yang dihasilkan:
// SELECT * FROM users WHERE status = 'active' AND (role = 'admin' OR role = 'editor')
Best Practice
Selalu gunakan closure untuk mengelompokkan kondisi OR yang kompleks. Ini mencegah logika yang tidak diinginkan dan membuat query lebih mudah dibaca.
Advanced Where Techniques
1. whereColumn
Membandingkan nilai antara dua kolom:
// Kolom yang sama
$users = DB::table('users')
->whereColumn('updated_at', 'created_at')
->get();
// Dengan operator
$users = DB::table('users')
->whereColumn('updated_at', '>', 'created_at')
->get();
2. whereExists
Mencari berdasarkan keberadaan subquery:
$users = DB::table('users')
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('orders')
->whereColumn('orders.user_id', 'users.id');
})
->get();
// SQL yang dihasilkan:
// SELECT * FROM users WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id)
3. whereJsonContains (untuk kolom JSON)
Mencari dalam kolom JSON:
// Mencari nilai dalam array JSON
$users = DB::table('users')
->whereJsonContains('preferences->tags', 'php')
->get();
// Mencari nilai dalam objek JSON
$users = DB::table('users')
->whereJsonContains('address->city', 'Jakarta')
->get();
4. whereRaw
Untuk query yang lebih kompleks, gunakan whereRaw:
$users = DB::table('users')
->whereRaw('LOWER(email) LIKE ? AND status = ?', ['%gmail.com', 'active'])
->get();
Peringatan!
Selalu gunakan parameter binding saat menggunakan whereRaw untuk mencegah SQL injection. Jangan langsung menyisipkan variabel ke dalam string query.
5. whereHas (Eloquent Relationships)
Mencari berdasarkan relasi Eloquent:
// Mencari user yang memiliki post aktif
$users = User::whereHas('posts', function ($query) {
$query->where('status', 'published');
})->get();
// Mencari user dengan jumlah post minimal
$users = User::whereHas('posts', function ($query) {
$query->where('status', 'published');
}, '>=', 3)->get();
6. whereDoesntHave
Mencari records yang tidak memiliki relasi tertentu:
// Mencari user yang belum memiliki post
$users = User::whereDoesntHave('posts')->get();
// Mencari user yang tidak memiliki post aktif
$users = User::whereDoesntHave('posts', function ($query) {
$query->where('status', 'published');
})->get();
Contoh Kasus Praktis
1. Pencarian Produk dengan Filter
public function searchProducts(Request $request)
{
$query = Product::query();
// Filter berdasarkan nama (jika ada)
if ($request->has('search')) {
$query->where('name', 'like', '%' . $request->search . '%');
}
// Filter berdasarkan kategori (jika ada)
if ($request->has('category')) {
$query->where('category_id', $request->category);
}
// Filter berdasarkan rentang harga (jika ada)
if ($request->has('min_price') && $request->has('max_price')) {
$query->whereBetween('price', [$request->min_price, $request->max_price]);
}
// Filter berdasarkan ketersediaan
if ($request->has('in_stock') && $request->in_stock) {
$query->where('stock', '>', 0);
}
return $query->paginate(20);
}
2. Dashboard Admin dengan Statistik
public function dashboard()
{
// Pengguna yang mendaftar hari ini
$newUsers = User::whereDate('created_at', today())->count();
// Pesanan dalam 7 hari terakhir
$recentOrders = Order::whereDate('created_at', '>=', now()->subDays(7))->count();
// Pendapatan bulan ini
$monthlyRevenue = Order::whereMonth('created_at', now()->month)
->whereYear('created_at', now()->year)
->where('status', 'completed')
->sum('total');
// Produk dengan stok rendah
$lowStockProducts = Product::where('stock', '<=', 5)
->whereNotNull('stock')
->where('stock', '>', 0)
->get();
return view('admin.dashboard', compact(
'newUsers',
'recentOrders',
'monthlyRevenue',
'lowStockProducts'
));
}
3. Sistem Notifikasi
public function getNotifications()
{
$user = auth()->user();
// Notifikasi belum dibaca
$unreadNotifications = Notification::where('user_id', $user->id)
->whereNull('read_at')
->orderBy('created_at', 'desc')
->get();
// Notifikasi yang sudah dibaca dalam 30 hari terakhir
$readNotifications = Notification::where('user_id', $user->id)
->whereNotNull('read_at')
->whereDate('created_at', '>=', now()->subDays(30))
->orderBy('created_at', 'desc')
->get();
return [
'unread' => $unreadNotifications,
'read' => $readNotifications
];
}
Tips Optimasi Query
- Gunakan indeks database - Pastikan kolom yang sering digunakan dalam where memiliki indeks
- Hindari penggunaan whereRaw berlebihan - Gunakan metode bawaan Laravel jika memungkinkan
- Batasi hasil dengan select kolom spesifik:
User::where('status', 'active')->select('id', 'name', 'email')->get();
- Gunakan eager loading untuk relasi:
User::with('posts')->where('status', 'active')->get();
- Gunakan chunk untuk data besar:
User::where('status', 'active')->chunk(100, function ($users) {
foreach ($users as $user) {
// Proses setiap user
}
}); - Gunakan when untuk kondisi dinamis:
$query = User::query();
$query->when($request->has('status'), function ($q) use ($request) {
return $q->where('status', $request->status);
});
$users = $query->get();
Debugging Query
Untuk melihat SQL query yang dihasilkan:
// Melihat query yang dihasilkan
$query = User::where('status', 'active');
dd($query->toSql(), $query->getBindings());
// Logging query
DB::enableQueryLog();
$users = User::where('status', 'active')->get();
dd(DB::getQueryLog());
Pro Tip
Gunakan package seperti Laravel Debugbar atau Clockwork untuk debugging query yang lebih mudah dan detail dalam pengembangan lokal.
Kesimpulan
Laravel menyediakan beragam metode where yang fleksibel dan powerful untuk memfilter data. Dari where dasar hingga metode lanjutan seperti whereJsonContains, kamu memiliki banyak pilihan untuk membuat query yang tepat sesuai kebutuhan aplikasi.
Kunci utama dalam menggunakan where di Laravel adalah:
- Memahami berbagai varian metode where dan kapan menggunakannya
- Mengelompokkan kondisi dengan benar menggunakan closure untuk logika yang kompleks
- Mengoptimalkan query dengan indeks dan pemilihan kolom yang tepat
- Menggunakan parameter binding untuk mencegah SQL injection
- Memanfaatkan metode helper seperti when() untuk kode yang lebih bersih
Dengan menguasai berbagai metode where di Laravel, kamu akan dapat membuat aplikasi yang lebih efisien dan mudah dipelihara. Jangan ragu untuk mengeksplorasi dokumentasi resmi Laravel untuk fitur-fitur terbaru dan best practice dalam penggunaan Query Builder.
Cheat Sheet Metode Where di Laravel
Metode | Kegunaan | Contoh |
---|---|---|
where() |
Filter dasar | where('status', 'active') |
whereNot() |
Negasi (Laravel 10+) | whereNot('status', 'inactive') |
orWhere() |
Kondisi OR | orWhere('role', 'admin') |
whereIn() |
Nilai dalam array | whereIn('id', [1, 2, 3]) |
whereNotIn() |
Nilai tidak dalam array | whereNotIn('id', [1, 2, 3]) |
whereBetween() |
Nilai dalam rentang | whereBetween('price', [10, 100]) |
whereNotBetween() |
Nilai di luar rentang | whereNotBetween('price', [10, 100]) |
whereNull() |
Nilai NULL | whereNull('deleted_at') |
whereNotNull() |
Nilai tidak NULL | whereNotNull('email_verified_at') |
whereDate() |
Filter berdasarkan tanggal | whereDate('created_at', '2023-01-01') |
whereMonth() |
Filter berdasarkan bulan | whereMonth('created_at', '12') |
whereDay() |
Filter berdasarkan hari | whereDay('created_at', '15') |
whereYear() |
Filter berdasarkan tahun | whereYear('created_at', '2023') |
whereTime() |
Filter berdasarkan waktu | whereTime('created_at', '>', '12:00:00') |
whereColumn() |
Perbandingan antar kolom | whereColumn('updated_at', '>', 'created_at') |
whereExists() |
Filter berdasarkan subquery | whereExists(function($query) {...}) |
whereJsonContains() |
Filter data JSON | whereJsonContains('options->tags', 'api') |
whereRaw() |
Query SQL mentah | whereRaw('LOWER(email) LIKE ?', ['%gmail.com']) |
whereHas() |
Filter berdasarkan relasi | whereHas('posts', function($q) {...}) |
whereDoesntHave() |
Filter tidak memiliki relasi | whereDoesntHave('posts') |
FAQ: Pertanyaan Umum
Bagaimana cara melakukan pencarian case-insensitive di Laravel?
Untuk pencarian case-insensitive, gunakan whereRaw
dengan fungsi LOWER
:
$users = DB::table('users')
->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%'])
->get();
Bagaimana cara menggabungkan beberapa kondisi OR yang kompleks?
Gunakan closure untuk mengelompokkan kondisi:
$users = User::where(function ($query) use ($search) {
$query->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%")
->orWhere('phone', 'like', "%{$search}%");
})->where('status', 'active')->get();
Apakah bisa menggunakan where dengan relasi Eloquent?
Ya, gunakan whereHas:
$posts = Post::whereHas('comments', function ($query) {
$query->where('is_approved', true);
})->get();
Bagaimana cara mencari dengan full-text search di Laravel?
Untuk MySQL, gunakan whereRaw dengan MATCH AGAINST:
$posts = Post::whereRaw(
'MATCH(title, content) AGAINST(? IN BOOLEAN MODE)',
[$searchTerm]
)->get();
Atau gunakan package seperti Laravel Scout dengan Algolia/Meilisearch untuk pencarian yang lebih canggih.
Bagaimana cara membuat filter dinamis dengan banyak parameter?
Gunakan metode when:
$query = Product::query();
$query->when($request->category, function ($q, $category) {
return $q->where('category_id', $category);
});
$query->when($request->min_price, function ($q, $minPrice) {
return $q->where('price', '>=', $minPrice);
});
$query->when($request->max_price, function ($q, $maxPrice) {
return $q->where('price', '<=', $maxPrice);
});
$products = $query->get();
Sumber Belajar Lebih Lanjut
- Dokumentasi Resmi Laravel Query Builder
- Dokumentasi Eloquent ORM
- Laracasts: Teknik Eloquent Lanjutan
- Source Code Laravel Query Builder
Kesimpulan Akhir
Metode where di Laravel adalah salah satu fitur paling serbaguna dan powerful dalam framework ini. Dengan memahami berbagai varian dan teknik penggunaannya, kamu dapat membuat query database yang efisien, mudah dibaca, dan mudah dipelihara. Teruslah berlatih dan eksplorasi berbagai kemungkinan untuk meningkatkan skill pengembangan Laravel kamu!