Optimasi Eloquent Relationship Query

Kalian udah pada sering pakai Eloquent Relationship apa belum nih? Kalau sudah pakai, apa sudah dioptimasi penggunaannya? Penyusunan query yang kurang tepat bisa meningkatkan 

Studi Kasus

Ada model Post dan model Category dan memiliki relasi one to many, satu Category dapat memiliki nol hingga banyak Post. Sekarang kita ingin mengambil semua Post dengan slug Category adalah "web-development". Maka pada umumnya kita harus mengambil Category dengan slug "web-development" terlebih dahulu, kemudian mencari Post yang memiliki Category tersebut.

Standard query
Standard query

Mari kita bedah query yg akan dihasilkan. Pertama, query diatas akan menghasilkan query SELECT `id`, `name` FROM `categories` WHERE `slug` = "web-development" LIMIT 1. Kemudian, setelah itu akan menjalankan query SELECT * FROM `posts` WHERE `category_id` = "$category->id". Query yang tidak optimal biasanya dapat ditinjau dari segi kemunculan datanya untuk ditampilkan. Disini setiap kali Post membutuhkan category untuk ditampilkan, maka query akan dijalankan lagi, lagi dan lagi.

Solusi

Sekarang mari kita lihat solusinya dengan menggunakan eloquent relationship eager loading.

Optimized query

Dengan menggunakan eager load, maka banyak query yang akan dihasilkan menjadi lebih optimal karena menggunakan sub query dan whereIn operator, mari kita bedah. Pertama, method whereHas akan menghasilkan subquery untuk tabel category. SQL nya kira-kira seperti ini SELECT * FROM `posts` EXISTS (SELECT * FROM `categories` WHERE `posts`.`category_id` = `categories`.`id` and `slug` = "web-development") . Setelah itu, eloquent akan mengambil smeua related data dengan operator whereIn, select `id`, `name`, `slug` from `categories` where `categories`.`id` in ('all-category-id'). Setelah itu, Laravel eloquent yang akan mengurus sisanya :)

Kesimpulan

Pastikan untuk selalu memperhatikan tujuan data tersebut diambil dari database untuk apa dan seberapa sering diakses. Biasanya metode eager load ini saya pakai ketika ingin menampilkan banyak data dan relasinya sekaligus seperti daftar atau tabel. Sekian artikel dari saya, jangan lupa share kalau dirasa bermanfaat. Terima kasih.

Reference

Related post