> For the complete documentation index, see [llms.txt](https://learn.devlabss.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.devlabss.my.id/laravel/bab-10-relasi-database/10.4-penjelasan-fungsi-eager-loading.md).

# 10.4 Penjelasan Fungsi Eager Loading

## Penjelasan fungsi eager loading

Di subbab sebelumnya, Anda sudah memakai:

```php
Buku::with('kategori')->get();
```

Sekarang kita pahami kenapa `with()` itu penting.

Sekilas mungkin terlihat seperti tambahan kecil.

Padahal di balik layar, efeknya sangat besar untuk performa query.

### Teori awal dan analogi

Bayangkan petugas perpustakaan diminta menyiapkan daftar 100 buku beserta kategorinya.

Kalau petugas bekerja tidak efisien, ia akan:

* ambil satu buku
* jalan ke rak kategori
* kembali
* ambil buku berikutnya
* jalan lagi ke rak kategori

Begitu terus berulang.

Itu melelahkan dan lambat.

Cara yang lebih cerdas adalah:

ambil dulu semua buku yang dibutuhkan, lalu ambil juga semua kategori yang terkait sekaligus.

Itulah ide dasar **eager loading**.

### Apa itu eager loading

Eager loading adalah teknik mengambil data relasi sejak awal saat query utama dijalankan.

Di Laravel, eager loading biasanya memakai:

```php
with('namaRelasi')
```

Contohnya:

```php
$bukus = Buku::with('kategori')->get();
```

Artinya, saat data buku diambil, data kategorinya juga ikut disiapkan.

### Kenapa eager loading penting

Kalau relasi tidak diambil sejak awal, Laravel bisa melakukan query tambahan berulang kali saat view membaca relasi.

Masalah ini sering dikenal sebagai **N+1 query problem**.

Sederhananya:

* 1 query untuk mengambil semua buku
* lalu banyak query tambahan untuk mengambil kategori tiap buku

Kalau jumlah data sedikit, mungkin belum terasa.

Tetapi kalau data makin banyak, aplikasi bisa melambat.

### Perbandingan sederhana

Tanpa eager loading:

```php
$bukus = Buku::all();
```

Lalu di Blade:

```blade
{{ $buku->kategori->nama_kategori }}
```

Kode ini bisa memicu query tambahan berkali-kali.

Dengan eager loading:

```php
$bukus = Buku::with('kategori')->get();
```

Data relasi sudah disiapkan lebih awal.

Jadi pembacaan di Blade jadi lebih efisien.

### Langkah praktik kecil untuk memahami alurnya

Ikuti urutan ini sambil melihat kode Anda.

{% stepper %}
{% step %}

### Lihat query tanpa eager loading

Bayangkan Anda menulis:

```php
$bukus = Buku::all();
```

Lalu di view Anda membaca relasi kategori untuk setiap buku.

Dalam kondisi ini, Laravel bisa mengambil kategori satu per satu saat dibutuhkan.
{% endstep %}

{% step %}

### Lihat query dengan eager loading

Sekarang bandingkan dengan:

```php
$bukus = Buku::with('kategori')->get();
```

Di sini Laravel sudah diberi tahu sejak awal bahwa relasi `kategori` juga akan dipakai.
{% endstep %}

{% step %}

### Pahami manfaatnya di halaman daftar

Halaman daftar buku biasanya menampilkan banyak baris sekaligus.

Semakin banyak baris, semakin terasa manfaat eager loading.

Itulah kenapa `with()` sangat cocok dipakai pada halaman index.
{% endstep %}
{% endstepper %}

### Penjelasan pasca-praktik

Sekarang mari kita bedah inti logikanya.

#### 1. `Buku::all()`

Query ini hanya mengambil data dari tabel `buku`.

Relasi kategori belum disiapkan.

Kalau nanti Anda memanggil `$buku->kategori`, Laravel mungkin perlu bertanya lagi ke database.

#### 2. `Buku::with('kategori')->get()`

Query ini mengambil data buku sekaligus memberitahu Laravel bahwa relasi `kategori` akan dipakai.

Jadi prosesnya lebih siap dari awal.

#### 3. Kenapa ini membantu performa

Karena jumlah query tambahan bisa ditekan.

Semakin besar data yang ditampilkan, semakin penting optimasi ini.

#### 4. Kapan eager loading sebaiknya dipakai

Biasanya eager loading sangat cocok dipakai saat:

* halaman daftar menampilkan banyak data
* relasi pasti akan dibaca di view
* performa mulai perlu dijaga

### Ringkasan cepat

Supaya mudah diingat:

* `all()` hanya mengambil data utama
* `with()` mengambil data utama plus relasinya
* eager loading membantu menghindari query berulang

### Troubleshooting yang paling sering

Masalah yang paling sering muncul:

* **masih bingung kenapa butuh `with()`** — karena relasi di view bisa memicu query tambahan
* **query terasa lambat saat data banyak** — eager loading belum dipakai
* **relasi tetap kosong** — masalahnya bukan di eager loading, tetapi di data foreign key atau konfigurasi relasi

{% hint style="warning" %}
Jangan menganggap eager loading sebagai hiasan tambahan. Saat data bertambah banyak, `with()` bisa sangat membantu performa aplikasi.
{% endhint %}

{% hint style="info" %}
Kalau Anda tahu relasi pasti akan dipakai di view, biasakan mempertimbangkan `with()` sejak awal.
{% endhint %}

### Poin evaluasi bab 10.4

Pastikan Anda sudah memahami poin berikut:

* Saya tahu arti eager loading.
* Saya tahu fungsi `with()` pada query Laravel.
* Saya paham eager loading membantu menghindari query berulang.
* Saya paham eager loading sangat cocok dipakai saat relasi akan ditampilkan di halaman daftar.

Jika semuanya sudah jelas, lanjut ke [10.5 Checkpoint: Uji Pemahamanmu Sebelum Lanjut!](/laravel/bab-10-relasi-database/10.5-checkpoint-uji-pemahamanmu-sebelum-lanjut.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.devlabss.my.id/laravel/bab-10-relasi-database/10.4-penjelasan-fungsi-eager-loading.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
