Home Paket Belajar Bootcamp Instruktur

Kuasai Eloquent ORM #6 - Mengenal Eager Loading & Menghindari N+1 Query

Pelajari Eloquent ORM Laravel dari dasar hingga mahir. Pahami berbagai jenis relasi seperti hasOne, hasMany, belongsTo, belongsToMany, hasManyThrough, hingga polymorphic relationship. Kuasai teknik query yang efisien menggunakan eager loading, constraint query, aggregate, subquery, serta cara menghindari N+1 Query agar aplikasi Laravel lebih cepat dan scalable. Materi disertai studi kasus dan best practice yang sering digunakan di proyek nyata.

✅ Telah dilihat 19 kali

Rating: 5.00 ⭐

... 08 June 2026, 19:34

Masalah N+1 Query

Ini adalah masalah performa paling umum saat pakai ORM.

// ❌ BURUK — N+1 Problem!
$posts = Post::all(); // 1 query

foreach ($posts as $post) {
    echo $post->user->name; // 1 query PER POST!
}

// Jika ada 100 post → 101 queries! 🔥

Solusi: Eager Loading dengan with()

// ✅ BAGUS — hanya 2 queries
$posts = Post::with('user')->get();

foreach ($posts as $post) {
    echo $post->user->name; // Data sudah di-load sebelumnya
}

// Query yang dijalankan:
// SELECT * FROM posts
// SELECT * FROM users WHERE id IN (1, 2, 3, ...)

Eager Loading Bersarang (Nested)

// Load relasi bertingkat
$posts = Post::with('user.profile')->get();

// Load banyak relasi sekaligus
$posts = Post::with(['user', 'tags', 'comments'])->get();

// Load relasi dengan kondisi (Constrained Eager Loading)
$posts = Post::with([
    'comments' => function ($query) {
        $query->where('approved', true)
              ->latest()
              ->limit(5);
    }
])->get();

withCount() — Hitung Relasi Tanpa Load Data

// Hitung jumlah comments tanpa load semua comment
$posts = Post::withCount('comments')->get();

foreach ($posts as $post) {
    echo $post->comments_count; // properti otomatis tersedia
}

// Hitung dengan kondisi
$posts = Post::withCount([
    'comments',
    'comments as approved_comments_count' => function ($query) {
        $query->where('approved', true);
    }
])->get();

load() — Lazy Eager Loading

Berguna jika model sudah di-load dan baru perlu relasi di kondisi tertentu:

$posts = Post::all();

// Kondisi tertentu baru load relasi
if ($needsUserData) {
    $posts->load('user');
}

// Load banyak relasi
$posts->load(['user', 'tags']);

loadMissing() — Load Hanya yang Belum Ada

$posts = Post::with('user')->get();

// Load tags hanya jika belum di-load
$posts->loadMissing('tags');

Deteksi N+1 dengan Laravel Debugbar

composer require barryvdh/laravel-debugbar --dev

Atau gunakan DB::listen untuk log query:

// Di AppServiceProvider::boot()
if (app()->isLocal()) {
    \DB::listen(function ($query) {
        logger($query->sql, $query->bindings);
    });
}

Mencegah Lazy Loading di Production

// Di AppServiceProvider::boot()
use Illuminate\Database\Eloquent\Model;

Model::preventLazyLoading(! app()->isProduction());
// Akan throw exception jika ada lazy load di development

Perbandingan Performa

// Skenario: 1000 posts, tampilkan nama user

// ❌ Tanpa Eager Loading
// → 1001 queries, ~500ms

$posts = Post::all();
foreach ($posts as $post) {
    echo $post->user->name;
}

// ✅ Dengan Eager Loading
// → 2 queries, ~20ms

$posts = Post::with('user')->get();
foreach ($posts as $post) {
    echo $post->user->name;
}

Ringkasan Episode 6

Method Kegunaan
with('relation') Eager load saat query
load('relation') Eager load setelah model ada
loadMissing() Load hanya yang belum ada
withCount() Hitung relasi tanpa load data
preventLazyLoading() Paksa dev sadar N+1

Daftar eBook