Pernah nggak sih kamu nulis query SQL panjang banget — penuh JOIN sana-sini — cuma buat ngambil data yang sebetulnya simple? Kalau iya, kamu pasti tahu betapa menyiksanya itu. Nah, di sinilah Eloquent Relationships hadir bak pahlawan bertopeng. Dengan fitur ini dalam migration Laravel, kamu bisa mendefinisikan hubungan antar tabel cuma dalam beberapa baris kode yang bersih dan mudah dibaca.
Di artikel ke-15 dari seri 50 Artikel Belajar Laravel ini, kita akan kupas tuntas semua jenis relasi Eloquent — mulai dari yang paling dasar hingga yang bikin developer senior kagum. Siap-siap, karena setelah membaca ini cara kamu memandang struktur database bakal berubah selamanya.
Eloquent Relationships adalah fitur ORM (Object-Relational Mapping) di Laravel yang memungkinkan kamu mendefinisikan hubungan antar tabel database langsung di dalam Model PHP. Dengan ini, query relasi bisa ditulis semudah $user->posts — tanpa SQL manual!
🔗 Relasi One to One dan One to Many di Laravel
Bayangkan kamu punya satu buah kunci dan satu gembok. Hanya kunci itu yang bisa membuka gembok itu — itulah analogi One to One. Sekarang bayangkan satu ibu punya beberapa anak — itulah One to Many. Konsep ini langsung berlaku di tabel database kamu yang dibuat lewat migration Laravel.
Laravel secara otomatis menebak nama foreign key berdasarkan nama model. Jika Model kamu bernama User, Eloquent akan cari kolom user_id secara otomatis. Patuhi konvensi ini di migration Laravel dan hidupmu akan jauh lebih mudah!
Mari kita lihat cara mendefinisikannya dengan langkah yang terstruktur:
Buat Migration untuk Tabel posts
Jalankan perintah artisan untuk membuat file migration Laravel baru.
Definisikan Foreign Key di File Migration
Edit file migration yang baru dibuat, tambahkan kolom user_id sebagai foreign key.
Tambahkan Method Relasi di Model
Buka app/Models/User.php dan definisikan relasi hasMany.
Di Laravel 7+, method foreignId('user_id')->constrained() adalah cara modern yang otomatis membuat kolom unsigned big integer DAN foreign key constraint sekaligus. Kamu nggak perlu lagi nulis dua baris terpisah seperti versi lama!
🔀 Many to Many: Relasi Paling Kompleks di Eloquent
Sekarang yang agak lebih menantang. Bayangkan sebuah artikel bisa punya banyak tag, dan satu tag bisa ada di banyak artikel. Ini adalah relasi Many to Many. Di dunia nyata: mahasiswa bisa ikut banyak mata kuliah, dan satu mata kuliah bisa diikuti banyak mahasiswa.
Untuk ini, kita butuh tabel pivot — yaitu tabel penghubung yang menyimpan kombinasi ID dari kedua tabel utama.
Laravel mengharapkan nama pivot table dalam format singular, alphabetical, underscore-separated. Contoh: relasi antara Post dan Tag → pivot table-nya adalah post_tag (bukan tag_post!). P sebelum T secara alfabetis. Kalau nama custom, bisa override di parameter kedua belongsToMany().
🚀 Has Many Through dan Polymorphic: Relasi Tingkat Lanjut
Has Many Through adalah seperti kamu mau tahu "negara mana yang punya banyak artikel?" padahal hubungannya adalah negara → user → artikel. Kamu melewati tabel user sebagai jembatan!
Polymorphic lebih keren lagi — satu model bisa berelasi dengan banyak model berbeda. Contoh: fitur komentar yang bisa ada di artikel dan di video sekaligus, tanpa perlu dua tabel komentar terpisah.
Setiap kali kamu mengubah file migration Laravel, jangan lupa jalankan php artisan migrate. Untuk development, gunakan php artisan migrate:fresh --seed untuk reset dan isi ulang database dari awal.
Analisis: Kapan Pakai Relasi Apa?
| Jenis Relasi | Method Laravel | Contoh Kasus | Butuh Pivot? |
|---|---|---|---|
| One to One | hasOne / belongsTo |
User → Profile | ❌ Tidak |
| One to Many | hasMany / belongsTo |
User → Posts | ❌ Tidak |
| Many to Many | belongsToMany |
Post ↔ Tag | ✅ Ya |
| Has Many Through | hasManyThrough |
Country → Posts via User | ❌ Tidak |
| Polymorphic | morphMany / morphTo |
Comment → Post/Video | ❌ Tidak |
✅ Best Practices Migration Laravel untuk Relasi Eloquent
Mengetahui sintaks saja belum cukup. Berikut beberapa praktik terbaik yang membedakan kode junior dari kode senior saat bekerja dengan migration Laravel dan Eloquent Relationships:
Selalu Tambahkan onDelete()
Tentukan perilaku saat data induk dihapus. Gunakan 'cascade' untuk hapus otomatis, atau 'restrict' untuk mencegah penghapusan.
Return Type di Method
Selalu tambahkan return type declaration (: HasMany) di method relasi. Ini membuat IDE bisa memberikan autocomplete yang akurat!
Pakai Eager Loading
Gunakan with() saat query relasi di loop. Artikel berikutnya akan bahas N+1 problem yang bisa bikin aplikasi kamu lemot!
Mau test relasi tanpa nulis controller dulu? Jalankan php artisan tinker lalu ketik langsung di terminal: User::find(1)->posts. Hasilnya langsung muncul di terminal — debugging tercepat yang ada!
Kesimpulan
Di artikel ini kita telah menjelajahi seluruh ekosistem Eloquent Relationships di Laravel.
Dengan memahami migration Laravel dan cara mendefinisikan relasi di Model, kamu sudah satu langkah lebih dekat menjadi Laravel developer yang handal. Artikel ke-16 kita akan bahas topik kritis yang sering diabaikan pemula: Eager Loading vs Lazy Loading — jangan sampai lewat!
Tags:
No comments:
Post a Comment