Minggu, 09 Agustus 2015

CRUD Polymorphic Relations di Laravel 5

CRUD Polymorphic Relations di Laravel 5 - Berawal dari sebuah masalah, bagaimana caranya menyimpan tabel user yang terdiri dari berbagai macam tipe user. Katakan saja, kita mempunyai user sebagai publisher dan advertiser. Nah, apakah kita akan membuat tabel user dan model user yang berbeda hanya untuk menyimpan nama, email, password, dan kesamaan lainnya?
Mungkin jika kita menggunakan cara naive, bisa menggunakan tabel user, tipe_user, publisher dan advertiser. Kemudian menggunakan foreign_key dan sebagainya (seperti yang diajarkan pada mata kuliah basis data) untuk menghubungkan tabel user dan publisher - advertiser.
Tetapi pada laravel tidak memerlukan itu, hanya perlu menggunakan Polymorphic Relations. Polymorphic Relations konsepnya sama seperti Inheritance pada mata kuliah Obyek Oriented Programming. Jadi publisher dan advertiser adalah turunan dari tabel user, sehingga kita tidak perlu mendefinisikan lagi.
Berikut cara menggunakan Polymorphic Relations pada Laravel 5:

Pertama :

Buat Model Advertiser dan Publisher lengkap dengan migrationnya. Kemudian pada migration user, advertiser, dan publisher tambahkan tabel sesuai kebutuhan. Misalnya seperti ini :
User :
  • id
  • name
  • email
  • pass
  • userable_id
  • userable_type
Advertiser :
  • id
  • pengeluaran
Publisher :
  • id
  • pendapatan
userable_id dan userable_type adalah tabel yang akan menghubungkan antara user dengan advertiser atau publisher.
Misalnya : userable_id = 1 dan userable_type = Advertiser

Kedua : 

Masuk ke dalam App\User.php, kemudian tambahkan kode seperti ini :
public function userable()
{
    return $this->morphTo();
}
Selanjutnya pada App\Advertiser.php dan App\Publisher.php tambah kode seperti ini :
public function user()
{
    return $this->morphMany('App\User', 'userable');
}
Nama fungsi userable karena pada database, kita menggunakan nama tabel userable_id dan userable_type.

Create :

Untuk membuat caranya adalah dengan membuat atau melakukan save dulu pada Advertiser/Publisher lalu menghubungkannya dengan user. Berikut simulasi menggunakan tinker.
$user = new App\User;
$user->name = 'Carolus Gaza';
$user->email = 'carolus@gaza.com';
$user->pass = 'inirahasia';
$publisher = new App\Publisher;
$publisher->penghasilan = 20000000;
$publisher->save();
$publisher->user()->save($user);

Hasilnya akan menjadi seperti ini :

  • name : "Carolus Gaza"
  • email : "carolus@gaza.com"
  • userable_type : "App\Publisher"
  • userable_id : 1

Read Update :

Read dan Update adalah fungsi yang hampir sama. Ketika kita akan melakukan read update ataupun delete, langkah pertama yang dilakukan adalah mencari ID yang akan di read atau update.
$user = App\User::find(1);
Ketika hanya ingin membaca nama atau email maka tinggal lakukan perintah sama seperti biasanya. Tetapi jika ingin melihat database yang ada di publisher, maka gunakan fungsi userable.
$user->email;
"carolus@gaza.com"

$user->userable->penghasilan;
20000000
Untuk melakukan update, sama saja. Tinggal panggil dan ubah mana yang ingin di ubah.

Delete

Untuk melakukan delete, sama seperti read/update, temukan dulu usernya sesuai ID. Kemudian lakukan perintah delete.
$user = App\User::find(1);
$user->userable->delete();
$user->delete();

Itulah sedikit sharing mengenai CRUD Polymorphic Relations di Laravel 5. Mungkin jika ada yang menemukan cara lain yang lebih simple daripada ini, ataupun cara lain untuk menyimpan tabel user, silahkan kita diskusikan di sini.

1 komentar

maaf saya masih belum kepikiran disituasi apa polymorphic lebih efisien dari native dengan menambahkan user_id

mohon penjelasannya

Silahkan tulis komentar pada kolom komentar di bawah. Komentar yang mengandung SARA dan spam akan dihapus.
EmoticonEmoticon