Eager Loading pada Eloquent


Bismillah

Dalam eloquent query dan model yang memiliki relasi, tentunya kamu pernah mendengar lazy loading dan eager loading.

lazy loading adalah meload data relasi ketika pertama kali digunakan. Dengan kata lain, ketika kamu query parent modelnya, model relasi belum di load.

Sedangkan eager loading adalah, meload relasi langsung ketika query parent dilakukan.

Lazy Loading

Sebagai contoh, kita punya dua table / model. Post dengan Comment. Post memiliki beberapa Comment, sedang Comment hanya terkait dengan satu Post. Jadi, relasinya adalah one (Post) to many (Comment).

Dalam lazy loading, ketika kita melakukan query seperti ini Post::all(), maka comments tidak akan keload langsung. Baru akan diload ketika kamu akses comments property nya.

$posts = Post::all();

foreach($posts as $post){
    echo $post->comments->count();
}

pada baris echo $post->comments->count();, comments baru di load.

Hal ini, menimbulkan masalah N + 1 query.

Misalkan, jumlah dari $posts disitu adalah 25, maka di kode diatas, dia akan melakukan query sebanyak N + 1. N = Jumlah posts, 1 = query pertama kali.

Terkadang, memang kita memerlukan lazy loading ini. Namun, diwaktu yang lain, kita ingin untuk tampilkan parent dengan semua relasi yang ada.

Eager Loading pada Eloquent

1. Cara Dasar

menggunakan method with dan memasukkan string sebagai argument. Contoh:

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

foreach ($posts as $post){
    echo $post->comments;
}

2. Beberapa Relasi

Terkadang, relasi ke suatu table banyak. Misal Post memiliki beberapa tags, dan comments, pun authors? Kamu dapat menggunakan with juga, namun array sebagai argument. Contoh:

$posts = Post::with(['comments', 'tags', 'authors'])->get();

foreach($posts as $post){
    echo $post->comments;
    echo $posts->tags;
    echo $posts->authors;
}

3. Relasi Bersarang

Nah, misal author juga memiliki kontak. Maka kamu bisa men-spesifikasikannya menggunakan dot syntax.

$posts = Post::with('author.contact')->get();

4. Hanya Kolom Tertentu

Ketiga cara diatas, akan melakukan query select * from. Nah, bagaimana kalau kita ingin memilih beberapa kolom saja? Kamu dapat menggunakan syntax dibawah ini:

table:id,col2

sebagai catatan, kamu harus memasukkan kolom id.

Contoh:

$posts = Post::with('author:id,username');

Penutup

Sebagai penutup, saya menggunakan teknik eager loading ini ketika membutuhkan array dengan seluruh bentuk, dari parent sampai childnya. Sebagai contoh dalam json :

[
    {
        "id": "1",
        "title": "hello world",
        "comments": {
            "id": '1',
            "name": "hello"
        }
    }
]

anggep saja hanya seperti itu, tapi banyak. Dan saya tidak mungkin untuk melakukan query terpisah untuk mendapatkan data dari comments.

Semoga bermanfaat. Walhamduillah....