Coding

Panduan Lengkap Query Builder Laravel: Where, WhereNot, WhereLike, dan Lainnya

11 min read
Admin Admin

Daftar Isi

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().

Tertarik baca Belajar React Native dari Nol! Cara Membuat Aplikasi Mobile yang Bisa Dipakai di Android & iOS di sini.

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:

Artikel terkait: Hasilkan Uang dengan HTML dan CSS! 5 Cara Mudah Menghasilkan Penghasilan Tambahan Sambil Belajar Coding
// 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:

Baca juga: Integrasi SSO di Multiple Aplikasi Dalam 15 Menit! Begini Cara Mudahnya
// 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

  1. Gunakan indeks database - Pastikan kolom yang sering digunakan dalam where memiliki indeks
  2. Hindari penggunaan whereRaw berlebihan - Gunakan metode bawaan Laravel jika memungkinkan
  3. Batasi hasil dengan select kolom spesifik:
    User::where('status', 'active')->select('id', 'name', 'email')->get();
  4. Gunakan eager loading untuk relasi:
    User::with('posts')->where('status', 'active')->get();
  5. Gunakan chunk untuk data besar:
    User::where('status', 'active')->chunk(100, function ($users) {
    foreach ($users as $user) {
    // Proses setiap user
    }
    });
  6. 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.

Metode Laravel Where

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

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!