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

devkon98's avatar

How to add new permissions on existing permission to the admin

Hello i have a case where the admin already has existing permissions and i should give new ones without updating or deleting the existing ones. This is the code i have currently:

  public function run()
    {
        $now = Carbon::now();
        $formPermissions = [
            ['name' => 'show_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'add_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'modify_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'delete_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'show_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'add_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'modify_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'delete_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
        ];

        $adminRole = Role::findByName('admin');

        foreach ($formPermissions as $permission) {
            Permission::create($permission);
            $adminRole->syncPermissions($formPermissions);
        }
    }
}

But gives me this error:

  Spatie\Permission\Exceptions\RoleAlreadyExists 

  A role `admin` already exists for guard `api`.

  at vendor/spatie/laravel-permission/src/Exceptions/RoleAlreadyExists.php:11
      7▕ class RoleAlreadyExists extends InvalidArgumentException
      8▕ {
      9▕     public static function create(string $roleName, string $guardName)
     10▕     {
  ➜  11▕         return new static("A role `{$roleName}` already exists for guard `{$guardName}`.");
     12▕     }
     13▕ }
     14▕ 

  1   app/Models/Role.php:53
      Spatie\Permission\Exceptions\RoleAlreadyExists::create()

  2   database/seeders/PermissionsSeeder.php:67
      App\Models\Role::create()

I had done another code which works as expected this is the code:

    public function run()
    {
        $now = Carbon::now();
        $permissions = [
            ['name' => 'show_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'add_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'modify_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'delete_email_to_providers_settings', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'show_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'add_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'modify_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
            ['name' => 'delete_email_to_providers_template', 'guard_name' => 'api', 'created_at' => $now, 'updated_at' => $now],
        ];

        $role = Role::where('name', 'admin')->first();

        Permission::query()->insert($permissions);

        $role->givePermissionTo(Permission::whereIn('name', array_column($permissions, 'name'))->get());
    }

But i was told : you can give permissions directly what is wrong with the first code?

0 likes
1 reply
Snapey's avatar

Are you sure it's this code? Its trying to create a Role, but you don't have this in your code.

Please or to participate in this conversation.