Berikut ini adalah contoh sederhana cara membuat relasi table dengan menggunakan laravel. Karena sudah menggunakan konsep MVC, pembuatan relasi table dengan laravel bisa kita lakukan dengan cara membuat fungsi di dalam model yang nanti nya bisa kita panggil saat melakukan query dengan eloquent.
Untuk pembuatan relasi ini, kita akan melanjutkan dari aplikasi yang sudah kita buat sebelumnya (https://soft-gain.com/2019/07/21/crud-pada-laravel-mysql/). Pertama-tama kita akan menambahkan field baru pada table sg_barang, buat migration dan edit file nya menjadi seperti ini :
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class UpdateTableSgBarang23072019 extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('sg_barang',function($table){
$table->bigInteger('updated_by')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('sg_barang',function($table){
$table->dropColumn('updated_by');
});
}
}
Tidak ada yang terlalu aneh dengan pembuatan migration ini, namun jika ingin penjelasan lebih rinci bisa di lihat di sini (https://soft-gain.com/2019/07/10/cara-dan-penjelasan-migration-pada-laravel/).
Tambahkan juga field baru ini ke dalam model sg_barang yang sudah di buat sebelumnya. Juga kita akan membuat fungsi baru yaitu getUpdatedBy, fungsi ini lah yang akan merasikan table sg_barang dan table users. Setelah di edit kurang lebih akan menjadi seperti ini :
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class sg_barang extends Model
{
protected $table = 'sg_barang';
protected $fillable = [
'nama_barang',
'jumlah_barang',
'keterangan',
'updated_by'
];
public function getUpdatedBy(){
return $this->hasOne(User::class, 'id', 'updated_by');
// return $this->hasOne(User::class, 'foreign_key', 'local_key');
}
}
Kita menambahkan satu value baru pada variable fillabel yaitu updated_by. Yang terpenting adalah penambahan fungsi getUpdatedBy, di sini kita me-return object model itu sendiri dan menggukan fungsi hasOne. HasOne adalah fungsi yang kita pakai jika relasi nya adalah one to one, untuk one to many bisa memakai hasMany. Selain itu masih banyak lagi fungsi yang bisa kita pakai seperti belongsTo, belongsToMany dan lain-lain. Detailnya bisa di lihat di dokumentasinya (https://laravel.com/docs/5.8/eloquent-relationships)
Selanjutnya kita akan ubah sedikit controller kita, buka controller sg_barang.php dan tambahkan fungsi yang sudah kita buat di model pada query eloquent di fungsi index. Kurang lebih tampilan fungsi index kita akan menjadi seperti ini :
public function index(){
$barangs = model::with('getUpdatedBy')->get();
return view('barang.table',compact('barangs'));
}
Ada penambahan fungsi with() pada query di atas. Nah di dalam with inilah fungsi yang sudah kita buat di model sebelumnya kita panggil. Untuk pemanggilan banyak fungsi sekaligus bisa di lakukan dengan cara seperti ini with([‘A,’B’]).
Selanjutnya ubah sedikit pada file table.blade.php pada bagian table, tambahkan kolom baru yang nanti nya akan kita isi informasi nama user yang terakhir melakukan perubahan pada database. Kurang lebih seperti ini :
<table class="table table-hover table-striped table-bordered">
<thead>
<tr>
<th class="text-center">Nama Barang</th>
<th class="text-center">Jumlah Barang</th>
<th class="text-center">Terakhir Ubah</th>
<th class="text-center"> </th>
</tr>
</thead>
<tbody>
@foreach($barangs as $barang)
<tr>
<td>{{ $barang->nama_barang }}</td>
<td>{{ $barang->jumlah_barang }}</td>
<td>{{ $barang->getUpdatedBy->name }}</td>
<td>
<a href="{{ URL::route('barang.edit',$barang->id) }}"><i class="fas fa-edit"></i></a>
<a href="{{ url('barang/destroy/'.$barang->id) }}"><i class="fas fa-trash-alt"></i></a>
</td>
</tr>
@endforeach
</tbody>
</table>
Setelah menyertakan fungsi yang kita buat di dalam model ke dalam controller dengan menggukan fungsi with, fungsi getUpdatedBy bisa kita akses sebagai attribute di view. Contoh penggunannya adalah $barang->getUpdatedBy->name, pertama kita panggil dulu nama fungsi nya yaitu getUpdatedBy, lalu karena yang kita butuhkan adalah field name, maka yang kita panggil berikutnya adalah name, menjadi getUpdatedBy->name. Cara kerjanya adalah namaFungsi->namaFieldPadaDatabase.
Terakhir ubah sedikit pada form.blade.php, saya menambahkan hidden textbox yang berisi user id login user. Hidden textbox ini lah yang akan di post saat data di perbaharui oleh user.
{{ Form::hidden('updated_by', Auth::user()->id, ['class' => 'form-control']) }}
Ya demikian lah cara membuat relasi dengan laravel, sebetulnya selain dengan cara memanfaatkan model kita juga masih bisa membuat relasi dengan menggunakan perintah ::join() langsung pada query eloquent nya. Namun untuk kali ini saya lebih memfokuskan pemanfaatan model dari laravel itu sendiri. Mohon di koreksi bila ada kekeliruan. Terima Kasih.