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 LaravelLet 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-appStep 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_tabledatabase/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_tabledatabase/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 Roleapp/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 UserRoleapp/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...