Tutorial Dasar : Membuat Relasi Database dengan Laravel Eloquent [Part 3]

Category : Tutorial - 28 January 2018 17:25:56
Tutorial Dasar : Membuat Relasi Database dengan Laravel Eloquent [Part 3]

Pada tutorial sebelumnya kita sudah belajar membuat Controller, View, dan Model untuk menampilkan data. Dalam sebuah model, kita harus mendefinisikan nama tabel, nama primary key, beserta dengan list kolom-kolomnya dengan tepat. Jika sudah, maka untuk memanggil data pada tabel yang bersangkutan, kita cukup memanggil melalui nama modelnya saja dengan method static ::get(). Lalu bagaimana caranya menampilkan data pada 2 buah tabel yang memiliki relasi? Hal tersebut bisa diselesaikan dengan sangat mudah di Laravel. Sebelum lanjut ke penggunaannya, kita perlu mengenal model relasi database yang paling umum digunakan. 

  1. Relasi one to one. Relasi dimana 1 data pada sebuah tabel hanya memiliki relasi ke 1 data pada tabel yang lain. Misalnya, 1 data tabel tb_User memiliki relasi 1 nomor telepon di tabel tb_Contact. Di laravel, kita menggunakan nama method hasOne(...) untuk mendefinisikan hal ini.
  2. Relasi one to many. Relasi dimana 1 data pada sebuah tabel memiliki relasi ke beberapa data pada tabel yang lain. Misalnya, 1 data tabel tb_Category memiliki relasi banyak data barang di tb_Inventory. Atau dengan kata lain, 1 kategori memiliki banyak data inventory. Di laravel, kita menggunakan nama method hasMany(...) untuk mendefinisikan hal ini.
  3. Relasi many to one (One to many Inverse). Relasi ini merupakan kebalikannya dari relasi one to many. Misalnya kita ingin mengetahui data barang di tb_Inventory memiliki kategori apa, maka relasi ini yang akan digunakan. Di laravel, kita akan sering menggunakannya dengan nama method belongsTo(...)
  4. Relasi many to many. Relasi 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. Relasi tersebut dapat dilakukan di Laravel dengan method belongsToMany(...).

Untuk mendefinisikan relasi pada sebuah model di Laravel, pertama-tama kita pilih dulu model relasi yang ingin kita buat. Misalnya pada contoh tabel di tutorial sebelumnya ada 2 buah tabel yaitu tabel tb_Inventory dan tb_Inventory_Category. Apa relasi antar kedua tabel tersebut? Relasinya adalah one to many pada tb_Inventory_Category ke tb_Inventory (karena 1 data kategori bisa memiliki banyak data barang), dan relasi inverse one to many pada tb_Inventory ke tb_Inventory_Category (karena banyak data kategori masing-masing hanya memiliki 1 data kategori). Jika relasi sudah diketahui, sekarang model sudah bisa dibuat. Kita buka kedua file model tersebut, dan kita buat definisinya seperti ini : 

<?php
#InventoryModel.php
namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class InventoryModel extends Model
{
    protected $table = 'tb_inventory';

    protected $primaryKey = 'id';

    protected $fillable = [
    	'nama_barang',
    	'jumlah',
    	'kategori',
    	'deskripsi',
    	'created_at',
    	'updated_at'
    ];

    //relasi many to one (Saya adalah anggota dari model ......)
    public function get_kategori(){
        return $this->belongsTo('App\\Model\\InventoryCategoryModel', 'kategori', 'id');
    }

}
<?php
#InventoryCategoryModel.php
namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class InventoryCategoryModel extends Model
{
    protected $table = 'tb_inventory_category';

    protected $fillable = [
    	'nama_kategori',
    	'deskripsi',
    	'created_at',
    	'updated_at'
    ];

    //relasi one to many (Saya memiliki banyak anggota di model .....)
    public function get_inventory(){
    	return $this->hasMany('App\\Model\\InventoryModel', 'kategori', 'id');
    }
    
}

Pendefinisian relasi di model dibuat dengan membuat sebuah method dengan nama bebas. Nama tersebut nantinya yang akan dipanggil ketika relasi ingin dijalankan. Isinya method tersebut hanya return $this-> dengan nama method relasi yang sesuai dengan kebutuhan. hasOne() untuk relasi one to one, hasMany() untuk relasi one to many, atau belongsTo() untuk relasi inverse one to many. Parameter pertama adalah alamat lengkap class model dimana relasi akan diberikan, parameter kedua adalah nama kolom relasi trigger, dan parameter terakhir (opsional) adalah parameter primary key target relasi dijalankan. Kalau bingung dengan parameternya, pastikan saja dulu alamat model relasinya sudah benar, sisanya kalau error tinggal dituker-tuker aja (pengalaman banget sering ketuker-tuker). 

 

Dari contoh script diatas, Relasi get_kategori di model InventoryModel akan memanggil data kategori yang sesuai dengan kolom kategori di model InventoryCategoryModel, dan relasi get_inventory akan memanggil data inventory apa saja yang ada di kategori bersangkutan. Cara memanggilnya adalah dengan menggunakan method with('nama_relasi') saat pemanggilan model. Contoh pemanggilannya dapat kita buat di file HomeController.

//sebelumnya : 
    	$inventory = InventoryModel::get();

//diganti menjadi : 
    	$inventory = InventoryModel::with('get_kategori')->get();
    	//nama get_kategori diambil dari nama relasi yang dibuat pada model InventoryModel

Apabila cara pemanggilannya sudah benar, maka variabel $inventory sudah berisi data inventory beserta dengan relasi yang bernama 'get_kategori'. Untuk menampilkannya, kita harus menyebutkan nama relasinya dulu, kemudian diikuti dengan nama kolom relasi yang ingin ditampilkan. Sebagai contoh, saya ingin menampilkan data "nama_kategori" di tabel tb_Inventory_Category. Karena relasi sudah terbentuk dengan nama "get_kategori", maka pemanggilan kategori di view home.blade.php berubah menjadi seperti ini :

<!--sebelumnya-->
			@foreach ($data as $row)
			<tr>
				<td>{{ $row->nama_barang }}</td>
				<td>{{ $row->jumlah }}</td>
				<td>{{ $row-kategori }}</td>
				<td>{{ $row->deskripsi }}</td>
				<td></td>
			</tr>
			@endforeach
<!--sekarang-->
			@foreach ($data as $row)
			<tr>
				<td>{{ $row->nama_barang }}</td>
				<td>{{ $row->jumlah }}</td>
				<td>{{ $row->get_kategori->nama_kategori }}</td> 
				<td>{{ $row->deskripsi }}</td>
				<td></td>
			</tr>
			@endforeach

Apabila pembuatan relasi di model tidak ada error, script pemanggilan di controller juga tidak error, dan nama relasi yang disebutkan pada view juga tidak error, hasilnya adalah seperti ini : 

 

Konsep relasi di Laravel ini sangat layak untuk dipelajari dan terus didalami. Kalau sudah dipahami, kita bisa membuat query database menjadi lebih rapi. Jika ada kesulitan selama mencoba membuat relasi di Laravel silakan share di kolom komentar di bawah..