Ok saya lanjutkan seri Laravel untuk pemula ini, dan kali ini akan membahas bagaimana menghubungkan sebuah model dengan model yang lain dengan Relationship. Relationship adalah sebuah fitur yang memungkinkan kita untuk merelasikan suatu model ke model lainnya, fitur ini sangat umum dijumpai pada framework yang menerapkan ORM ( Object Relational Mapper ).

Jadi gampangnya seperti ini, misalkan ada model Customer dan Order, nah kita ingin mengetahui user dengan id tertentu dia sudah melakukan order apa saja maka kita buatkan relasi 1 ke banyak pada model Customer ke Order.

Dan kodenya kira - kira seperti ini.

$customer = Customer::find(1);
$customer->orders;

Dengan begitu semua orderan yang dilakukan Customer dengan id 1 akan didapatkan. Cukup simple bukan, jadi kita tidak perlu lagi berkutat dengan query yang rumit lagi. 

Oh iya sekedar info ini adalah lanjutan Laravel tutorial sebelumnya, jadi sangat saya sarankan untuk membaca artikel pada seri pertama dan kedua.

 

php artisan migrate --seed

 

Relationship

 

Ada banyak macam model relationship di Laravel jika kalian masih ingat matakuliah/pelajaran Basis Data maka pasti kedengarannya tidak asing lagi yaitu ada : One to one, One to many, Many to many, Many to one, One to one ( polymorphic ), One to many ( polymorphic ), Many to many ( polymorphic ).

Mungkin yang terdengar asing adalah polymorphic, dengan relasi polymorphic kalian bisa merelasikan model kalian ke 1 atau lebih model tapi yang saya bahas disini hanya sampai Many to many saja.

Ok sebagai bahan saya sudah siapkan laravel plus data dummy bisa didownload di github.

Setelah kalian download jalankan command berikut untuk menginstall package yang diperlukan.

composer install

Lalu setelah itu migrate dan seed databasenya.

php artisan migrate --seed

Oh iya jangan lupa ubah konfigurasi database kalian di file .env ya :) .

 

One to One

Kita mulai dari relasi yang paling mudah terlebih dahulu, pada contoh yang ada di github saya merelasikan tabel clients dan profiles dimana 1 client hanya bisa memiliki 1 profile jadi kita akan menghubungkan model Client dengan Profile caranya dengan sebagai berikut.

public function profile() {
     return $this->hasOne(Profile::class);
}

Kalian tinggal buat method tersebut pada model Client, sementara method hasOne digunakan untuk mendefinisikan relasi 1 ke 1 dimana parameter pertama adalah Model yang diajak relasi dan parameter kedua adalah foreign key dari tabel profiles( client_id ).

Jika dilihat dari kode diatas saya tidak memberikan nilai pada parameter kedua dan mungkin kalian bertanya darimana laravel tahu foreign key-nya?.

Jawabannya adalah dari format penulisan, maksudnya adalah jika kalian mengikuti format penulisan tabel dari laravel maka kalian tidak perlu mem-passing value untuk foreign key pada Relationship.

Format tabel ini juga pernah saya singgung di tutorial sebelumnya . Jadi secara default laravel akan mendeteksi nama_tabel_id sebagai foreign key nah dalam kasus diatas ketika nama tabelnya clients maka otomatis akan terbaca client_id.

 

One to Many

Jenis relationship yang kedua adalah one-to-many, dimana 1 model akan memiliki relasi dengan 1 atau lebih model. Dimana dalam kasus ini adalah Supplier dengan Item.

public function items() {
     return $this->hasMany(Item::class);
}

Secara kode tidak jauh berbeda dengan yang one-to-one hanya berbeda nama relasinya saja menggunakan hasMany untuk parameter juga sama seperti hasOne tadi.

 

Many to One

Nah ini kebalikan dari many-to-many tadi. Letak perbedaan relasi ini terletak pada pendefinisiannya jika 2 relasi yang tadi didefinisikan pada tabel parent sementara many-to-one didefinisikan pada tabel child.

public function supplier() {
     return $this->belongsTo(Supplier::class);
}

Dimana dalam kasus model Supplier dan Item ini, model Item bertindak sebagai child jadi relasinya kita definisikan pada model Item dan parameter kedua tetap mengambil foreign key dari tabel items dalam hal ini supplier_id.

 

Many to Many

Dan yang terakhir sekaligus yang paling rumit adalah many-to-many. Jika relasi yang lainnya hanya melibatkan 2 tabel, berbeda dengan many-to-many yang melibatkan 3 tabel.

dimana tabel ke 3 adalah tabel pivot atau tabel bantu. Nah dalam kasus ini tabel bantu/pivot adalah orders yang menghubungkan tabel clients dan items.

Contoh seperti berikut.

public function orders() {
    return $this->belongsToMany(Item::class, 'orders');
}

Relasi ini dimanakan belongsToMany, disini saya merelasikan model Client dengan Item melewati tabel orders. Perbedaan terdapat pada parameter kedua dan seterusnya, pada parameter kedua kalian mem-passing tabel yang kalian gunakan untuk menghubungkan 2 tabel yang lainnya dalam hal ini tabel orders adalah yang menjadi penghubung.

lalu parameter ketika dan keempat adalah foreign key pertama dari tabel orders ( client_id ) dan foreign key kedua dari tabel orders ( item_id ).

 

Eksekusi

Karena kita hanya akan menguji relasi antar model jadi kita diperlu membuat view, controller, dan route. Saya disini akan memperkenalkan sebuah package yang cukup powerfull untuk keperluan testing model.

Nama package tersebuat adalah tinx cara downloadnya bisa dilihat di dokumentasinya. Tapi kalian tidak perlu repot untuk install karena saya sudah sertakan package tersebut pada laravel dummy jadi ketika kalian sudah menjalankan command comoposer install maka packagenya pun sudah otomatis terinstall.

Cara menggunakannya juga sangat mudah, kalian masuk kedalam root folder laravel dengan terminal/cmd kemudian jalankan artisan command.

php artisan tinx

Maka kurang lebih tampilan awalnya seperti ini.

Hebatnya lagi ini akan otomatis membuat instance dari semua model yang kita buat, misalkan saya ingin melihat client pertama tinggal ketik $c sesuai shortcut yang sudah diberikan kemudian tekan enter maka otomatis menampilkan client diurutan pertama perintah ini sama dengan ketika kita menjalankan App\Client::first dan jika ingin menampilkan client terakhir pakai $c_ atau sama dengan App\Client::latest()->first().

Ok kita mulai saja yang kita testing disini adalah relasi one-to-one dan one-to-many karena selain itu cara penggunaannya sama, yang pertama ada one-to-one dimana 1 client akan berelasi dengan 1 profile maka kita tinggal panggil $c->profile dan hasilnya seperti ini.

Nah disana kita bisa lihat return value-nya adalah instance dari App\Profile jadi dengan kata lain dengan adanya relasi kita bisa mengakses model Profile dari model Client ini juga berlaku pada jenis relasi lainnya.

Ok satu lagi saya akan contohkan pada relasi hasMany, dimana model yang terlibat adalah Supplier dan Item jadi kita jalankan perintah $s->items lalu enter maka hasilnya akan seperti ini.

Bisa dilihat ada sedikit perbedaan disana, pada relasi hasMany return yang dikeluarkan adalah berupa array iyaa namanya juga many pasti lebih dari 1 :v.

Tapi bagaimana jika kalian ingin mengambil 1 item saja dari relasi hasMany?, caranya cukup mudah kalian tinggal gunakan method first(), jadi syntaxnya seperti ini $s->items->first().

Maka hasilnya akan seperti ini.

Oh iyaa sedikit info, package tinx ini tidak ada reload otomatis jadi setiap kalian mengubah kode kalian harus jalankan fungsi re() untuk mereload instance.

 

Ok untuk sisanya kalian coba explore sendiri ya :v. Dan jika mengalami kendala atau kesusahan atau sejenisnya silahkan langsung dikomen.
Untuk kalian yg lagi cari monitor atau aksesoris seperti keyboard, mousepad dan mouse bisa lihat rekomendasi saya di tokopedia ya.