Saat membangun aplikasi dengan Laravel, kamu tidak selalu harus menggunakan Eloquent ORM. Untuk query yang lebih kompleks atau ketika performa menjadi prioritas, Query Builder adalah pilihan yang tepat. Query Builder menyediakan antarmuka yang nyaman dan aman untuk membangun query SQL tanpa menulis SQL mentah secara langsung.
Apa Itu Query Builder?
Query Builder adalah lapisan abstraksi di atas PDO yang disediakan Laravel melalui facade DB. Dengan Query Builder, kamu bisa membangun query secara berantai (method chaining), dan Laravel akan menangani escaping data secara otomatis sehingga terhindar dari SQL Injection.
Mengambil Data (Select)
Cara paling dasar adalah mengambil seluruh baris dari sebuah tabel:
use Illuminate\Support\Facades\DB;
// Ambil semua data dari tabel users
$users = DB::table('users')->get();
// Ambil kolom tertentu saja
$users = DB::table('users')->select('name', 'email')->get();
// Ambil satu baris pertama
$user = DB::table('users')->where('email', 'john@example.com')->first();
// Ambil nilai satu kolom saja
$email = DB::table('users')->where('id', 1)->value('email');
Filtering dengan Where
Query Builder menyediakan banyak variasi method where untuk memfilter data:
// Where biasa
$users = DB::table('users')->where('status', 'active')->get();
// Where dengan operator
$users = DB::table('users')->where('age', '>=', 18)->get();
// Multiple where (AND)
$users = DB::table('users')
->where('status', 'active')
->where('role', 'admin')
->get();
// Where OR
$users = DB::table('users')
->where('role', 'admin')
->orWhere('role', 'editor')
->get();
// Where IN
$users = DB::table('users')->whereIn('id', [1, 2, 3])->get();
// Where NULL
$users = DB::table('users')->whereNull('deleted_at')->get();
// Where Between
$orders = DB::table('orders')
->whereBetween('created_at', ['2024-01-01', '2024-12-31'])
->get();
Insert, Update, dan Delete
Query Builder juga mendukung operasi tulis ke database:
// Insert satu baris
DB::table('products')->insert([
'name' => 'Laptop Gaming',
'price' => 15000000,
'created_at' => now(),
'updated_at' => now(),
]);
// Insert dan ambil ID yang baru dibuat
$id = DB::table('products')->insertGetId([
'name' => 'Monitor 4K',
'price' => 5000000,
]);
// Update data
DB::table('products')
->where('id', $id)
->update(['price' => 4500000]);
// Increment/Decrement kolom angka
DB::table('products')->where('id', 1)->increment('stock', 10);
DB::table('products')->where('id', 1)->decrement('stock', 2);
// Delete
DB::table('products')->where('id', $id)->delete();
Join Tabel
Query Builder mendukung berbagai jenis JOIN untuk menggabungkan beberapa tabel:
$orders = DB::table('orders')
->join('users', 'orders.user_id', '=', 'users.id')
->join('products', 'orders.product_id', '=', 'products.id')
->select(
'orders.id',
'users.name as customer_name',
'products.name as product_name',
'orders.total'
)
->where('orders.status', 'completed')
->orderBy('orders.created_at', 'desc')
->get();
Aggregasi dan Grouping
Untuk kebutuhan pelaporan, Query Builder menyediakan fungsi agregasi:
// Hitung total baris
$count = DB::table('users')->where('status', 'active')->count();
// Jumlah, rata-rata, min, max
$total = DB::table('orders')->sum('total');
$average = DB::table('orders')->avg('total');
$max = DB::table('orders')->max('total');
// Group By dengan having
$summary = DB::table('orders')
->select('user_id', DB::raw('SUM(total) as total_belanja'))
->groupBy('user_id')
->having('total_belanja', '>', 500000)
->get();
Pagination dan Limit
Membatasi dan mem-paginate hasil query sangat mudah:
// Limit dan offset manual
$users = DB::table('users')->limit(10)->offset(20)->get();
// Pagination otomatis Laravel
$users = DB::table('users')->paginate(15);
// Simple pagination (prev/next saja)
$users = DB::table('users')->simplePaginate(15);
Raw Expression
Ketika kamu membutuhkan ekspresi SQL khusus yang tidak didukung Query Builder secara langsung, gunakan DB::raw():
$users = DB::table('users')
->select(DB::raw('COUNT(*) as total, status'))
->groupBy('status')
->get();
// whereRaw untuk kondisi SQL mentah
$users = DB::table('users')
->whereRaw('YEAR(created_at) = ?', [2024])
->get();
Kesimpulan
Query Builder Laravel adalah alat yang sangat powerful untuk berinteraksi dengan database secara fleksibel. Dengan method chaining yang intuitif, kamu bisa membangun query kompleks mulai dari select, join, agregasi, hingga insert dan update โ semuanya dengan perlindungan dari SQL Injection secara otomatis. Gunakan Query Builder ketika kamu butuh kendali penuh atas query tanpa overhead Eloquent, terutama untuk query pelaporan atau query yang melibatkan banyak tabel.