Eloquent Many to Many Relationship Tutorial in Laravel 11
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
// $users = User::find(2);
// return $users;
// $users = User::with("roles")->get();
// return $users;
// $users = User::find(1);
// return $users->roles;
// $users = User::find(1);
// foreach($users->roles as $data) {
// echo $data->role_name . "<br>";
// }
// To show All users data as shown below :
$users = User::get();
foreach ($users as $data) {
echo $data->id . "<br>";
echo $data->name . "<br>";
echo $data->email . "<br>";
foreach ($data->roles as $dataTwo) {
echo $dataTwo->role_name . " / ";
}
echo "<hr>";
}
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
// Add new User and Assign new role
// $user = User::find(2);
// $user->roles()->attach(1);
// Below process is for assigning user roles to any particular user
// Add new User and Assign multiple roles
// $user = User::find(3);
// $roles = [2,3];
// $user->roles()->attach($roles);
// Remove any role assigned to particular user
// $user = User::find(3);
// $user->roles()->detach(3);
// Update role for assign to user
$user = User::find(2);
$roles = [1, 4, 3];
$user->roles()->sync($roles);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
Above File is app\Http\Controllers\UserController FileBelow File is app\Http\Controllers\RoleController File
<?php
namespace App\Http\Controllers;
use App\Models\Role;
use Illuminate\Http\Request;
class RoleController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$role = Role::find(4);
return $role->users;
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
// Below Process is for Assigning Role to any particular User
// Here below, 3rd role(Here, Contributor) from "roles" table will assign to user_id = 4
$role = Role::find(3);
$userid = [1, 2, 4];
$role->users()->sync($userid);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
Below File is app\Models\User File
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public $timestamps = false;
protected $table = "users";
protected $fillable = ["name", "email"];
public function roles()
{
return $this->belongsToMany(Role::class, "user_roles");
}
}
Below File is app\Models\Role File
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
public $timestamps = false;
protected $table = "roles";
protected $fillable = ["role_name"];
public function users()
{
return $this->belongsToMany(User::class, "user_roles");
}
}
Below File is app\Models\User_Role File
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User_Role extends Model
{
public $timestamps = false;
protected $fillable = ["user_id", "role_id"];
protected $table = "user_roles";
}
Below File is database\json\users File
[
{
"name": "Yahoo Baba",
"email": "yahoobaba@gmail.com"
},
{
"name": "Salman Khan",
"email": "salman@gmail.com"
},
{
"name": "Deepika Padukone",
"email": "deepika@gmail.com"
},
{
"name": "Abhishek Bachchan",
"email": "abhishek@gmail.com"
}
]
Below File is database\json\roles File
[
{
"role_name": "Administrator"
},
{
"role_name": "Author"
},
{
"role_name": "Contributor"
},
{
"role_name": "Editor"
}
]
Below File is database\json\user_role File
[
{
"user_id": 1,
"role_id": 3
},
{
"user_id": 1,
"role_id": 4
},
{
"user_id": 4,
"role_id": 4
},
{
"user_id": 4,
"role_id": 1
},
{
"user_id": 1,
"role_id": 2
}
]
Below File is database\migrations\2024_12_11_050019_create_users_table File
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string("name", 50);
$table->string("email", 50)->unique();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('users');
}
};
Below File is database\migrations\2024_12_11_050924_create_roles_table File
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string("role_name", 50)->unique();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('roles');
}
};
Below File is database\migrations\2024_12_11_055003_create_user_roles_table File
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('user_roles', function (Blueprint $table) {
$table->foreignId("user_id")->constrained("users")->onUpdate("cascade")->onDelete("cascade");
$table->foreignId("role_id")->constrained("roles")->onUpdate("cascade")->onDelete("cascade");
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('user_roles');
}
};
Below File is database\seeders\UserSeeder File
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$json = File::get(path: "database/json/users.json");
$users = collect(json_decode($json));
$users->each(function ($user) {
User::create([
"name" => $user->name,
"email" => $user->email
]);
});
}
}
Below File is database\seeders\RoleSeeder File
<?php
namespace Database\Seeders;
use App\Models\Role;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$json = File::get(path: "database/json/roles.json");
$roles = collect(json_decode($json));
$roles->each(function ($role) {
Role::create([
"role_name" => $role->role_name
]);
});
}
}
Below File is database\seeders\UserRoleSeeder File
<?php
namespace Database\Seeders;
use App\Models\User_Role;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;
class UserRoleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$json = File::get(path: "database/json/user_role.json");
$user_role = collect(json_decode($json));
$user_role->each(function ($data) {
User_Role::create([
"user_id" => $data->user_id,
"role_id" => $data->role_id
]);
});
}
}
Below File is database\seeders\DatabaseSeeder File
<?php
namespace Database\Seeders;
use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
// User::factory(10)->create();
// User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
$this->call([
UserSeeder::class,
RoleSeeder::class,
UserRoleSeeder::class
]);
}
}
Below File is routes\web File
.png)
.png)
.png)
.png)
.png)
Comments
Post a Comment