You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10使用spatie/laravel-permission填充数据时遇角色不存在错误

问题:Laravel 10使用spatie/laravel-permission填充数据时提示RoleDoesNotExist

我是Laravel新手,正在学习spatie/laravel-permission,当前使用Laravel 10版本。尝试通过数据填充为数据库添加角色和用户时,遇到错误Spatie\Permission\Exceptions\RoleDoesNotExist,提示"There is no role named admin"。我已在RoleSeeder中创建admin角色,且User模型引入了HasRoles trait,不清楚问题所在,恳请帮助。


相关代码文件

RoleSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;

class RoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        Role::create(['name' => 'super admin', 'team_id' => 1, 'guard_name' => 'web']);
        Role::create(['name' => 'admin', 'team_id' => 1, 'guard_name' => 'web']);
        Role::create(['name' => 'user', 'team_id' => 1, 'guard_name' => 'web']);
    }
}

AdminSeeder.php

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class AdminSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $user = User::create( [
            'name' => 'admin',
            'email' => 'admin@gmail.com',
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        ]);
        $user->assignRole('admin');
    }
}

DatabaseSeeder.php

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $this->call([RoleSeeder::class, AdminSeeder::class]);
    }
}

User.php

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, HasRoles;

    protected $guard_name = 'web';

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
    ];
    
}

可能的原因及解决办法

1. 多租户/团队字段不匹配

你创建角色时指定了team_id,说明启用了spatie的多租户模式,但创建用户时没有关联对应team_id,导致权限系统找不到对应团队下的角色。

解决:
给用户添加team_id字段,和角色的team_id保持一致:

$user = User::create( [
    'name' => 'admin',
    'email' => 'admin@gmail.com',
    'email_verified_at' => now(),
    'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
    'team_id' => 1, // 新增该行
]);
$user->assignRole('admin');

如果不需要多租户功能,直接移除RoleSeeder里的team_id参数:

Role::create(['name' => 'super admin', 'guard_name' => 'web']);
Role::create(['name' => 'admin', 'guard_name' => 'web']);
Role::create(['name' => 'user', 'guard_name' => 'web']);

2. 重新执行迁移和填充

可能之前的迁移或填充未正确执行,导致角色数据未写入数据库。执行以下命令重置并重新填充:

php artisan migrate:fresh --seed

3. 清除权限缓存

权限系统的缓存可能导致角色无法被识别,执行命令清除缓存:

php artisan cache:clear
php artisan permission:cache-reset

4. 确认guard_name一致性

你的User模型和Role中的guard_name都是web,这部分没问题,但如果后续新增其他guard,需确保角色和用户的guard_name完全匹配。


内容的提问来源于stack exchange,提问作者Fly_Moe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:13:32