Dalam memanfaatkan database, dikenal ada relasi antar entity atau antar tabel. Penggunaan fitur ini pada database konvesional membutuhkan penggunaan perintah SQL yang relatif panjang dan juga membutuhkan penanganan dari program yang membutuhkan program yang rumit pula. Artikel ini membahas mengenai Relationship pada Eloquent yang memudahkan penggunaan database yang memiliki relationship.
Laravel Database Relationship
Berikut adalah beberapa jenis relasi database yang dikenal pada umumnya dan telah diakomodasi oleh Laravel.
- Relasi one to one dimana sebuah data pada sebuah tabel hanya memiliki relasi ke sebuah data pada tabel yang lain. Misalnya, sebuah data tabel tb_User memiliki relasi 1 nomor telepon di tabel tb_Contact.
- Relasi one to many dimana sebuah data pada sebuah tabel memiliki relasi ke beberapa data pada tabel yang lain. Misalnya, sebuah data tabel tb_Category memiliki relasi banyak data barang di tb_Inventory. Atau dengan kata lain, 1 kategori memiliki banyak data inventory.
- Relasi many to one (One to many Inverse) dimana merupakan kebalikan dari relasi one to many. Misalnya kita ingin mengetahui data barang di tb_Inventory memiliki kategori apa, maka relasi ini yang akan digunakan.
- Relasi many to many dimana banyak data pada sebuah tabel memiliki relasi ke banyak data juga pada tabel yang lainnya. Relasi tersebut terbentuk melalui sebuah tabel bantu. Misalnya, banyak data pada tabel tb_Siswa memiliki relasi peminjaman ke banyak data pada tabel tb_Buku. Relasi tersebut terbentuk dengan tabel bantu bernama tb_Transaksi.
One to One
Merupakan relasi paling dasar. Misalnya: Setiap User memiliki 1 Phone. Argumen pertama yang diteruskan ke metode hasOne adalah nama model terkait.
- Eloquent Dynamic Properties – Setelah hubungan didefinisikan, record terkait dapat diambil dengan properti dinamis Eloquent.
- Foreign Key
- Eloquent menentukan foreign key berdasarkan nama model. Dalam hal ini, model Phone diasumsikan memiliki foreign_key default user_id.
- Menetapkan Foreign Key dimana default dari relationship User dan Phone adalah user_id. Untuk menetapkan Foreign Key secara manual, dapat dituliskan sebagai parameter kedua.
- Local Key
- Eloquent mengasumsikan bawa foreign key adalah berhubungan dengan local key yang berupa primary key, baik default atau yang dicustom melalui model.
- Apabila dibutuhkan untuk relasi dengan menggunakan local key lainnya bisa dituliskan di parameter ketiga:
- Definisi Relationship sebaliknya. Untuk mendapatkan siapa user yang memiliki sebuah phone, perlu didefinisikan relationship sebaliknya (Inverse Relationships), dengan menggunakan method belongsTo
- Inverse Relationships Foreign Key.
Pada contoh sebelumnya, Eloquent mencoba mencocokkan user_id dari model Phone ke id dari model User. Default foreign key name adalah nama method dari relationship ditambah akhiran _id, sehingga pada contoh adalah user_id.
Apabila tidak sesuai, dapat dituliskan pada argumen kedua belongsTo:
- Inverse Relationships Primary Key
Apabila diiginkan relasi tidak menggunakan default primary key, dapat dituliskan di parameter ketiga belongsTo:
One to Many
Pada contoh kasus blog, sebuah (one) user akan memiliki banyak (many) posts. Contoh berikut, sebuah post akan memiliki banyak comments. Foreign key pada contoh ini: post_id. Sesuai dengan snake case nama model diikuti _id.
- Dynamic Properties
- Setelah didefinisikan, maka pada contoh, collection dari comments dapat diakses melalui comments property.
- Seperti sebelumnya Eloquent menyediakan “dynamic properties”, sehingga methods dapat diakses seolah sebuah property dari model:
- Query Builder: Chain Conditions
Pada saat mengakses tabel pada relasi, dapat digunakan perintah lain secara berantai (chain) sebagai ketentuan.
- Foreign dan Local Key
Penggunaan foreign dan primary (local) key pada One to Many juga serupa pada One to One.
- One to Many (Inverse)
Untuk mengakses pemilik relasi (sisi one), maka digunakan belongsTo
- Mengakses Dynamic Property
Setelah didefinisikan, maka dynamic property dapat diakses dari tabel yang direlasikan. Dalam contoh ini adalah property title dari post (nama method). Relasi berdasar post_id pada model asal, nama method diikuti _ dan kemudian primary column yaitu pada contoh adalah id
- Non Default Key
Seperti sebelumnya apabila nama key tidak default:
Many to Many
- Relasi ini juga banyak dipergunakan. Penggunaannya sedikit lebih kompleks dibanding 2 tipe relasi sebelumnya.
- Contoh berikut adalah di mana terdapat users, roles, dan role_user. Seorang user dapat memiliki banyak role dan sebuah role dapat dimiliki banyak user.
- role_user merupakan default table perantara (intermediate) atau pivot. Nama table adalah dari kedua table role dan user sesuai urutan abjad
- Relasi didefinisikan dengan menggunakan method belongsToMany.
- Mengakses Dynamic Properties
Setelah didefinisikan maka dynamic properties dapat diakses seperti contoh di bawah:
- Penggunaan method chaining juga dimungkinkan setelah dilakukan proses definisi
- Pivot Table
Seperti disebutkan sebelumnya nama tabel pivot dihasilkan dari kedua nama tabel dan diurutkan abjad. Apabila dibutuhkan dapat didefinisikan pada parameter kedua dari method belongsToMany.
- Selain mendefinisikan nama tabel pivot, seperti pada jenis relasi lainnya, key dari masing-masing table dapat didefinisikan seperti contoh berikut:
- Berikut adalah definisi untuk Inverse:
- Isi tabel pivot dapat diakses dengan atribut pivot
- Apabila terdapat field/column lain pada pivot table, dan didefinisikas dengan menuliskan pada method withPivot
- Timestamps pada Pivot. Agar timestamps (created_at dan updated_at) di pivot dapat diatur secara otomatis perlu ditambahkan perintah withTimestamps pada defisini relasi.