Query Builder dan Eloquent Lanjutan di Laravel (where, join, pagination, scope)

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.

Alat Query Eloquent Lanjutan
Alat Query Eloquent Lanjutan

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

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *