Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

LaraBABA's avatar

Reseed Spattie permissions and roles

Hi all,

Just need a bit of advice to make sure I am doing it right(The Laravel way).

When I update my controllers, from time to time I need to add more permissions and roles.

What is the best way to re-seed as the below command will not work and I really do not want to refresh all my seeders as I have many.

php artisan db:seed --class="PermissionsSeeder"

Shall I add this at the top of the seeder?

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\PermissionRegistrar;

class PermissionsSeeder extends Seeder
{
    public function run()
    {
  //HERE//
        DB::table('roles')->truncate();
        DB::table('roles_has_permissions')->truncate();
       DB::table('model_has_roles')->truncate();
       DB::table('model_has_permissions')->truncate();
  //HERE//
        // Reset cached roles and permissions
        app()[PermissionRegistrar::class]->forgetCachedPermissions();

        // Create default permissions
        Permission::create(['name' => 'list services']);
        Permission::create(['name' => 'view services']);
        Permission::create(['name' => 'create services']);
        Permission::create(['name' => 'update services']);
        Permission::create(['name' => 'delete services']);

        Permission::create(['name' => 'view profile']);
        Permission::create(['name' => 'update profile']);


        // Create user role and assign existing permissions
        $currentPermissions = Permission::all();
        $userRole = Role::create(['name' => 'user']);
        $userRole->givePermissionTo($currentPermissions);

        // Create admin exclusive permissions
        Permission::create(['name' => 'list roles']);
        Permission::create(['name' => 'view roles']);
        Permission::create(['name' => 'create roles']);
        Permission::create(['name' => 'update roles']);
        Permission::create(['name' => 'delete roles']);

        Permission::create(['name' => 'list permissions']);
        Permission::create(['name' => 'view permissions']);
        Permission::create(['name' => 'create permissions']);
        Permission::create(['name' => 'update permissions']);
        Permission::create(['name' => 'delete permissions']);

        Permission::create(['name' => 'list users']);
        Permission::create(['name' => 'view users']);
        Permission::create(['name' => 'create users']);
        Permission::create(['name' => 'update users']);
        Permission::create(['name' => 'delete users']);

        // Create admin role and assign all permissions
        $allPermissions = Permission::all();
        $adminRole = Role::create(['name' => 'super-admin']);
        $adminRole->givePermissionTo($allPermissions);

        $user = \App\Models\User::whereEmail('[email protected]')->first();

        if ($user) {
            $user->assignRole($adminRole);
        }
    }
}

Thank you!

0 likes
4 replies
Sinnbeck's avatar
Sinnbeck
Best Answer
Level 102

If you want to remove them all and just add them to the admin, then yes that should work fine. Personally I have so many roles and permissions set, that I only add the new ones that I need. I have made a webpage in my admin where I can add it from :)

1 like
LaraBABA's avatar

@Sinnbeck Thanks for the reply. Yes I have this too in my admin panel(I have built the GUI for it), but when you wish to update your remote, you need some kind of seeding rather than manually ticking all the permissions no? Do you always do it manually from local to remote?

Sinnbeck's avatar

@User476820 oh yeah I have a seeder using factories for each part of my app to set up locally

1 like

Please or to participate in this conversation.