Recursive Relation di Laravel

Mahir Koding – Artikel ini dibuat atas dasar pengalaman sendiri ketika saya sedang merancang ERD untuk sebuah project. Kasus yang terjadi saat itu adalah ketika saya ingin membuat tabel category yang bisa memiliki sub-category. Sebagai contoh, ada sebuah produk yang berkategorikan “pakaian” dimana kategori pakaian ini merupakan sub-category dari Fashion. Sekilas, kita bisa saja membuat 2 buah tabel yaitu tabel category dan sub_category. Namun, kategori pakaian bisa saja memiliki sub_category lagi misalnya Pakaian Pria atau Pakaian Tidur. Apakah kita perlu membuat 1 tabel sub_sub_kategori lagi? Bayangkan saja jika kategori-kategori tersebut memiliki child yang tidak terbatas kedalamannya.

Jika kamu tetap bersikeras menggunakan style multi-table seperti category dan sub_category, maka kamu akan menghadapi sebuah masalah lagi. Bayangkan, jika si admin ingin mengassign produk celana jeans di kategori “Pakaian Pria” dan ingin mengakses semua produk dengan kategori “Fashion“. Apakah produk celana jeans dapat ditampilkan di kategori fashion? Bisa iya dan bisa tidak, tergantung kedalaman relasinya dan seberapa sanggup kamu melakukan join terus menerus haha.

Contoh lain yang dapat teman-teman temui adalah ketika ingin membuat thread di forum ka*kus. Disana, kamu bisa membuat thread di level kategori yang kedalaman yang berbeda-beda. Berikut adalah penampakannya :

Halaman ketika ditampilkan :

Halaman ketika ingin membuat thread baru :

Pada halaman new thread, kamu bisa membuat thread di kategori Games, PC Games, ataupun PUBG. Bebas, tidak wajib memilih child paling bawah saja. Ketika kamu membuka kategori Games, semua thread PUBG, AoV, Dota 2, dll pun akan ikut muncul selama thread tersebut dibawahi oleh kategori Games baik secara langsung maupun tidak langsung (melalui perantara sub kategori lagi).

Lalu, bagaimana cara mengoptimalkan struktur databasenya? Cukup 1 tabel saja! Solusi yang saya implementasikan sampai saat ini adalah membuat tabel seperti berikut :

Keterangan : parent_id berisikan id parent kategori yang diinginkan. Jika kategori tersebut tidak memiliki parent (level paling atas), isikan saja dengan NULL. Berikut adalah bentuk datanya setelah diinsert :

Lalu, bagaimana bentuk implementasi eloquentnya di Laravel? Berikut adalah contoh kodingannya :

Model :

https://gist.github.com/heryvandoro/71710141f5552294076a23b985a48991

Controller :

https://gist.github.com/heryvandoro/aa3616889503dc9a657368931a300a32

Untuk routingnya, silahkan atur sendiri ya. Begini kira-kira hasilnya :

Select all categories : https://jsonformatter.org/2f5957

Select categories with id 12 (FPS) : https://jsonformatter.org/c86be8

Demikianlah artikel mengenai recursive relation di laravel. Mungkin ini belum solusi yang paling konkrit, jika ada yang punya saran atau pendapat tersendiri silahkan share di kolom komentar. Semoga bermanfaat.