Effortless Role & Permission Seeding in Laravel: A Quick Setup Guide

This tutorial is part of this mini project on Laravel vue spa. To see all the sections of this project click here

Step 01: Setting Up migration, factory and seeder of Permission model

// artisan commands
php artisan make:model Permission -ms
php artisan
make:migration create_permission_role_table
// migration file for permissions table
public function up(): void
{
    Schema::create('permissions', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}
//changing model Permission.php 
class Permission extends Model
{
    use HasFactory;

    protected $fillable = ['name'];
}
// PermissionSeeder.php 
public function run(): void
{
    Permission::create(['name' => 'issues.create']);
    Permission::create(['name' => 'issues.update']);
    Permission::create(['name' => 'issues.delete']); 
}
// DatabaseSeeder.php
public function run(): void
{
    $this->call(PermissionSeeder::class);
}

Step 02: Setting Up migration, factory and seeder of Role model

//aritsan command 
php artisan make:model Role -ms
//migration file for roles table
public function up(): void
{
    Schema::create('roles', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}
// migration file create_permission_role_table 
public function up(): void
{
    Schema::create('permission_role', function (Blueprint $table) {
        $table->foreignId('permission_id')->constrained();
        $table->foreignId('role_id')->constrained();
    });
}
// changing model Role.php 
class Role extends Model
{
    use HasFactory;

    protected $fillable = ['name'];

    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }     
}
// RoleSeeder.php 
public function run(): void
{
    $admin = Role::create(['name' => 'Administrator']);
    $admin->permissions()->attach(Permission::pluck('id'));

    $editor = Role::create(['name' => 'Editor']);
    $editor->permissions()->attach(
        Permission::where('name', '!=', 'issues.delete')->pluck('id')
    );
}
// DatabaseSeeder.php
public function run(): void
{
    $this->call(PermissionSeeder::class);
    $this->call(RoleSeeder::class);
}

Related Posts


Seeding users and role_user data

Seeding clients and issues data

Adding client column in table

Storing issue in db table

Update issue

Showing user data and logout

Permission securing backend

Permission securing frontend