Halo teman-teman semuanya, di artikel sebelumnya kita telah belajar 2 jenis relasi, yaitu One to One
dan One to Many
dan sekarang kita akan belajar membuat relasi Meny to Many
.
Apa itu Relasi Many to Many
?
Many-to-many
relationships merupakan relasi dimana data di dalam table A bisa memiliki banyak data di dalam table B dan juga sebaliknya, data di dalam table B bisa memiliki banyak data di dalam table A.
Disini kita tidak dapat melakukan relasi langsung antara table A ke dalam table B, oleh sebab itu kita harus memiliki satu table lagi untuk menghubungkan dari kedua table tersebut, biasanya table ini di sebut dengan pivot table
. Kurang lebih seperti berikut ini :
Dari gambar di atas bisa kita lihat bersama-sama, kita memiliki satu table lagi yang bernama user_role
, table inilah yang disebut dengan pivot table
, dimana akan difungsikan untuk menyimpan id
dari masing-masing table yang berhubungan.
table user
id |
name |
1 |
Fika Ridaul Maulayya |
2 |
Rizqi Maulana |
3 |
Yudi Purwanto |
table roles
id |
name |
1 |
super admin |
2 |
admin |
3 |
user |
table user_role
(Pivot Table)
user_id |
role_id |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
1 |
3 |
3 |
Langkah 1 - Membuat Model dan Migration Role
Karena Model dan Migration User
sudah ada, maka kita tinggal membuat untuk yang Role
.
Silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Laravel-nya.
php artisan make:model Role -m
Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :
-
app/Models/Role.php
-
database/migrations/2022_09_04_072845_create_roles_table.php
INFORMASI : nama file migration akan random sesuai tanggal pembuatannya.
Sekarang, kita akan menambahkan beberapa field di dalam file migration. Silahkan buka file database/migrations/2022_09_04_072845_create_roles_table.php
dan pada function up
ubahlah menjadi seperti berikut ini.
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
Di atas, kita menambahkan 1 field baru, yaitu :
ATTRIBUTE |
TYPE DATA |
OPTIONS |
DESCRIPTION |
name |
string |
- |
untuk menyimpan nama role. |
Langkah 2 - Membuat Migration User Role
Setelah itu, kita lanjutkan membuat Migration tanpa Model. Ini digunakan untuk membuat pivot table-nya dan di dalanya akan berisi relasi ke dalam 2 table.
Silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Larave-nya.
php artisan make:migration create_user_role_table
Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan file migration baru di dalam folder database/migrations/2022_09_04_073639_create_user_role_table.php
.
INFORMASI : nama file migration akan random sesuai tanggal pembuatannya.
Silahkan buka file tersebut dan pada function up
ubahlah menjadi seperti berikut ini.
public function up()
{
Schema::create('user_role', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('role_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});
}
Di atas, kita menambahkan 2 field baru, yaitu :
ATTRIBUTE |
TYPE DATA |
OPTIONS |
DESCRIPTION |
user_id |
unsignedBigInteger |
foreign key |
untuk melakukan relasi dengan table users . |
role_id |
unsignedBigInteger |
foreign key |
untuk melakukan relasi dengan table roles . |
Langkah 3 - Menjalankan Migration
Sekarang kita akan menjalankan perintah migrate, agar table dan field yang sudah kita tambah di atas digenerate ke dalam database.
Silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Laravel-nya.
php artisan migrate
Langkah 4 - Membuat Relasi Many to Many
Kita lanjutkan membuat relasi Many to Many
dikedua Model, yaitu User
dan Role
.
Pertama, kita akan menambahkan di dalam Model User
terlebih dahulu. Silahkan buka file app/Models/User.php
, kemudian ubah kode-nya menjadi seperti berikut ini.
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* phone
*
* @return void
*/
public function phone()
{
return $this->hasOne(Phone::class);
}
/**
* roles
*
* @return void
*/
public function roles()
{
return $this->belongsToMany(Role::class, 'user_role');
}
}
Di atas, kita menambahkan method roles
dan di dalamnya kita membuat relasi Belongs To Many
ke dalam Model Role
dan diparameter kedua adalah nama table pivote-nya, yaitu user_role
.
Setelah berhasil menambahkan di dalam Model User
, maka kita akan lakukan langkah yang sama di dalam Model Role
. Silahkan buka file app/Models/Role.php
, kemudian ubah kode-nya menjadi seperti berikut ini.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
use HasFactory;
/**
* users
*
* @return void
*/
public function users()
{
return $this->belongsToMany(User::class, 'user_role');
}
}
Di atas, kita menambahkan method baru dengan nama users
dan di dalamnya kita melakukan relasi Belongs To Many
ke dalam Model User
dan kita set pivot table-nya dengan user_role
.
Langkah 5 - Menampilkan Data Role di Data User
INFORMASI : silahkan masukkan data secara manual di dalam table roles
dan table user_role
sesuai dengan contoh table di atas (pembukaan artikel).
Sekarang kita akan coba menampilkan data roles di dalam data user. Silahkan buka file resources/views/users.blade.php
, kemudian ubah kode-nya menjadi seperti berikut ini.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Eloquent Relationships : Relasi One to One & Many To Many</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet"
crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="card mt-5">
<div class="card-body">
<h3 class="text-center"><a href="https://santrikoding.com">www.santrikoding.com</a></h3>
<h5 class="text-center my-4">Laravel Eloquent Relationship : One To One & Many To Many</h5>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Nama User</th>
<th>Nomor Telepon</th>
<th>Roles</th>
</tr>
</thead>
<tbody>
@foreach($users as $user)
<tr>
<td>{{ $user->name }}</td>
<td>{{ $user->phone->phone }}</td>
<td>
@foreach ($user->roles()->get() as $role)
<button class="btn btn-sm btn-primary me-2">{{ $role->name }}</button>
@endforeach
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
Di atas, untuk menampilkan relasi Many to Many
sama seperti relasi Many
, yaitu kita melakukan perulangan menggunakan foreach
.
@foreach ($user->roles()->get() as $role)
//...
@endforeach
roles()
di atas merupakan relasi / method yang sudah kita buat sebelumnya di dalam Model User
.
Dan jika kita coba jalankan di dalam browser dengan mengetikkan http://localhost:8000/users, maka hasilnya seperti berikut ini.
Untuk menampilkan data users di dalam data role, sama seperti di atas, kita cukup memanggil method-nya dan kita lakukan perulangan menggunakan foreach
.**
Kurang lebih contohnya seperti berikut ini.
@foreach ($role->users()->get() as $user)
//...
@endforeach
Mungkin sampai disini pembahasan bagaimana cara membuat relasi di dalam Laravel menggunakan Eloquent Relationships. Jika teman-teman ada kendala atau pertanyaan, silahkan bisa ber-komentar dibawah atau melalui group telegram.
Terima Kasih