Setelah menguasai CRUD dasar, Anda perlu query yang lebih canggih: menyaring data dengan banyak kondisi, mengurutkan, menghitung, dan membaginya per halaman. Eloquent dan Query Builder Laravel menyediakan semua itu dengan sintaks yang elegan. Artikel ini membahas Query Builder dan Eloquent lanjutan di Laravel secara mendalam.

Kondisi WHERE yang Lengkap
Menyaring data adalah kebutuhan paling sering. Eloquent menyediakan banyak variasi where:
<?php
// kondisi dasar
Produk::where('harga', '>', 10000)->get();
Produk::where('stok', 0)->get();
// beberapa kondisi (AND)
Produk::where('harga', '>', 10000)
->where('stok', '>', 0)
->get();
// kondisi ATAU (OR)
Produk::where('kategori', 'minuman')
->orWhere('kategori', 'makanan')
->get();
// nilai di dalam daftar
Produk::whereIn('kategori', ['minuman', 'snack'])->get();
// rentang nilai
Produk::whereBetween('harga', [5000, 20000])->get();
// nilai kosong / tidak kosong
Produk::whereNull('gambar')->get();
Produk::whereNotNull('gambar')->get();
// pencarian teks (LIKE)
Produk::where('nama', 'like', '%kopi%')->get();
?>
Mengurutkan dan Membatasi Data
<?php
// urut termahal dulu
Produk::orderBy('harga', 'desc')->get();
// ambil 5 terbaru
Produk::latest()->take(5)->get();
// data teracak
Produk::inRandomOrder()->limit(3)->get();
// hanya satu data
Produk::where('kode', 'A1')->first();
?>
Agregat: Menghitung Data
Untuk statistik dan dashboard, Eloquent punya fungsi agregat yang menjalankan perhitungan di sisi database (cepat):
<?php
Produk::count(); // jumlah baris
Produk::sum('harga'); // total harga
Produk::avg('harga'); // rata-rata
Produk::max('harga'); // tertinggi
Produk::where('stok', 0)->count(); // jumlah yg stok habis
?>
Join Antar Tabel
Meski relasi Eloquent lebih disukai, kadang join langsung berguna untuk laporan:
<?php
use Illuminate\Support\Facades\DB;
$data = DB::table('pesanan')
->join('users', 'users.id', '=', 'pesanan.user_id')
->select('pesanan.id', 'users.name', 'pesanan.total')
->get();
?>
Pagination (Bagi Data per Halaman)
Ini salah satu fitur Laravel yang paling menghemat waktu. Cukup ganti get() dengan paginate():
<?php
public function index()
{
$produk = Produk::latest()->paginate(10); // 10 per halaman
return view('produk.index', compact('produk'));
}
?>
Di Blade, tampilkan data dan link navigasi halaman secara otomatis:
@foreach ($produk as $p)
<p>{{ $p->nama }}</p>
@endforeach
{{ $produk->links() }} {{-- link 1 2 3 ... otomatis --}}
Laravel otomatis membaca parameter ?page= di URL dan menghitung offset — tidak perlu kode pagination manual sama sekali.
Local Scope: Query yang Bisa Dipakai Ulang
Jika Anda sering menulis kondisi yang sama (misalnya “produk aktif”), buat scope di Model agar query lebih ringkas dan mudah dibaca:
<?php
// di Model Produk
public function scopeAktif($query)
{
return $query->where('stok', '>', 0);
}
public function scopeMahal($query, $batas)
{
return $query->where('harga', '>', $batas);
}
?>
Sekarang panggil dengan sintaks yang bersih:
<?php Produk::aktif()->get(); // produk yang ada stok Produk::aktif()->mahal(50000)->get(); // aktif DAN mahal ?>
Menghitung Relasi dengan withCount
Untuk menampilkan “jumlah komentar tiap post” tanpa masalah N+1:
<?php
$posts = Post::withCount('comments')->get();
foreach ($posts as $post) {
echo $post->comments_count; // otomatis tersedia
}
?>
Memproses Data Besar dengan chunk
Bila mengolah ribuan baris (misalnya kirim email massal), memuat semua sekaligus bisa kehabisan memori. Gunakan chunk() untuk memproses per bagian:
<?php
User::chunk(200, function ($users) {
foreach ($users as $user) {
// proses 200 user per iterasi
}
});
?>
Kesalahan Umum
- Masalah N+1 — lupa
with()/withCount()saat menampilkan data berelasi. - Pagination hilang saat filter — tambahkan
->appends(request()->query())padalinks()agar parameter pencarian ikut terbawa. - Memuat semua data lalu memfilter di PHP — boros memori. Filter di query (
where) agar database yang bekerja.
Kesimpulan
Anda telah menguasai Query Builder dan Eloquent lanjutan Laravel: kondisi where lengkap, pengurutan, agregat, join, pagination otomatis, local scope untuk query reusable, withCount, dan chunk untuk data besar. Kemampuan ini membuat Anda bisa membangun fitur pencarian, filter, laporan, dan dashboard yang efisien. Semakin banyak query dijalankan di sisi database (bukan di PHP), semakin cepat aplikasi Anda.
Referensi: untuk pendalaman, kunjungi dokumentasi resmi Laravel.

