How to Many to Many Relationship in Laravel 9 Example?

Mar 28, 2022 . Admin

Hi friends,

In this tutorial, we will see how to many to many relationship in laravel 9 example. Laravel Many to many relationship is a little bit complicated than one to one and one to many relationships in laravel 9 app. In this post many to many eloquent relationship; Through this tutorial, i am going to show you what is many to many relationship and how to use many to many relationship in laravel 9 app. An example of a many-to-many relationship is a user that has many roles and those roles are also shared by other users in the application.

Laravel 9 many to many relationship is slightly more complicated than hasOne and hasMany relationships.

So, let's start following example:

Step 1: Download Laravel

Let us begin the tutorial by installing a new laravel application. if you have already created the project, then skip following step.

composer create-project laravel/laravel example-app
Step 2: Create Migrations

Now we have to create migration of "users", "roles" and "role_user" table. we will also add foreign key with users and roles table. so let's create like as below:

users table migration:
<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
};
    php artisan make:migration create_roles_table
database/migrations/2022_3_28_000000_create_roles_table.php
<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('roles', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('roles');
    }
};
    php artisan make:migration create_role_user_table
database/migrations/2022_3_28_000000_create_role_user_table.php
<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {
            $table->foreignId('user_id')->constrained('users');
            $table->foreignId('role_id')->constrained('roles');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {   
        Schema::dropIfExists('role_user');
    }
};
Step 3: Create Models

Here, we will create User, Role and UserRole table model. we will also use "belongsToMany()" for relationship of both model.

app/Models/User.php
<?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

     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
  
    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array

     */
    protected $hidden = [
        'password',
        'remember_token',
    ];
  
    /**
     * The attributes that should be cast.
     *
     * @var array

     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
  
    /**
     * The roles that belong to the user.
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class, 'role_user');
    }
}
    php artisan make:model Role
app/Models/Role.php
<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class Role extends Model
{
    use HasFactory;
  
    /**
     * The users that belong to the role.
     */
    public function users()
    {
        return $this->belongsToMany(User::class, 'role_user');
    }
}
    php artisan make:model UserRole
app/Models/UserRole.php
<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class UserRole extends Model
{
    use HasFactory;
      
}
Step 4: Retrieve Records
$user = User::find(1);  
 
dd($user->roles);
$role = Role::find(1);  
 
dd($role->users);
Step 5: Create Records
$user = User::find(2);  
 
$roleIds = [1, 2];
$user->roles()->attach($roleIds);
$user = User::find(3);  
 
$roleIds = [1, 2];
$user->roles()->sync($roleIds);
$role = Role::find(1);  
 
$userIds = [10, 11];
$role->users()->attach($userIds);
$role = Role::find(2);  
 
$userIds = [10, 11];
$role->users()->sync($userIds);

I hope you understand of many to many relationship...

#Laravel 9