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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

One on One Relationship

One on One Relationship

  • Eloquent Dynamic Properties – Setelah hubungan didefinisikan, record terkait dapat diambil dengan properti dinamis Eloquent.
Mengambil data dengan relasi

Mengambil data dengan relasi

  • 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.
Foreign key

Foreign key

  • 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:
Local Key

Local Key

  • Definisi Relationship sebaliknya. Untuk mendapatkan siapa user yang memiliki sebuah phone, perlu didefinisikan relationship sebaliknya (Inverse Relationships), dengan menggunakan method belongsTo
Belongs To

Belongs To

  • 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 Foreign Key

Inverse Foreign Key

  • Inverse Relationships Primary Key
    Apabila diiginkan relasi tidak menggunakan default primary key, dapat dituliskan di parameter ketiga belongsTo:
Inverse Relationship Foreign Key

Inverse Relationship Foreign Key

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.

Model pada One To Many

Model pada One To Many

  • 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:
Dynamic Properties

Dynamic Properties

  • Query Builder: Chain Conditions
    Pada saat mengakses tabel pada relasi, dapat digunakan perintah lain secara berantai (chain) sebagai ketentuan.
Chain Conditions

Chain Conditions

  • Foreign dan Local Key
    Penggunaan foreign dan primary (local) key pada One to Many juga serupa pada One to One.
Foreign dan Local Key pada One to Many

Foreign dan Local Key pada One to Many

  • One to Many (Inverse)
    Untuk mengakses pemilik relasi (sisi one), maka digunakan belongsTo
Inverse One to Many

Inverse One to Many

  • 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
Mengakses Dynamic Property

Mengakses Dynamic Property

  • Non Default Key
    Seperti sebelumnya apabila nama key tidak default:

Non Default Key - One to Many

Non Default Key - One to Many

Non Default Key – One to Many

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.
belongsToMany

belongsToMany

  • Mengakses Dynamic Properties
    Setelah didefinisikan maka dynamic properties dapat diakses seperti contoh di bawah:

Dynamic Properties

    Dynamic Properties
  • Penggunaan method chaining juga dimungkinkan setelah dilakukan proses definisi
Chaining Many to Many

Chaining Many to Many

  • 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.
Pivot Table

Pivot Table

  • Selain mendefinisikan nama tabel pivot, seperti pada jenis relasi lainnya, key dari masing-masing table dapat didefinisikan seperti contoh berikut:
Key Field Name

Key Field Name

  • Berikut adalah definisi untuk Inverse:
Many to Many Inverse

Many to Many Inverse

  • Isi tabel pivot dapat diakses dengan atribut pivot
Atribut Pivot

Atribut Pivot

  • Apabila terdapat field/column lain pada pivot table, dan didefinisikas dengan menuliskan pada method withPivot
withPivot

withPivot

  • Timestamps pada Pivot. Agar timestamps (created_at dan updated_at) di pivot dapat diatur secara otomatis perlu ditambahkan perintah withTimestamps pada defisini relasi.
Timestamps pada Pivot

Timestamps pada Pivot

Written by: SEW 20191205