Tutorial Laravel Eloquent Relationships #5 : Many to Many


Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com
Tutorial Laravel Eloquent Relationships #5 : Many to Many

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 :

  1. app/Models/Role.php
  2. 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



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami


ARTIKEL TERKAIT