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 File




Below 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
<?php

use App\Http\Controllers\RoleController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::resource("users", UserController::class);
Route::resource("roles", RoleController::class);






Comments

Popular posts from this blog

Eloquent with JSON Data Columns Tutorial in Laravel 11

Blade Template Tutorial Three Template Inheritance in Laravel 11