Laravel 9 Many to Many Relationship Example

Laravel 9

Nicesnippets

28-03-2022


Laravel 9 Many to Many Relationship Example

Hi friends,

In this tutorial, we will see how to use many to many relationship in Laravel 9 with an example. Many to many relationship is a little bit complicated than one to one and one to many relationships. Laravel 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 application. 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:

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

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:

database\migrations\2014_10_12_000000_create_users_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('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');

}

};

roles table migration:

php artisan make:migration create_roles_table

database\migrations\2014_10_12_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');

}

};

role_user table migration:

php artisan make:migration create_role_user_table

database\migrations\2014_10_12_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');

}

};

Create Models:

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

app\Http\Model\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');

}

}

Role Model:

php artisan make:model Role

app\Http\Model\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');

}

}

UserRole Model:

php artisan make:model UserRole

app\Http\Model\UserRole.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;

class UserRole extends Model

{

use HasFactory;

}

Retrieve Records:

$user = User::find(1);

dd($user->roles);

$role = Role::find(1);

dd($role->users);

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...