代码之家  ›  专栏  ›  技术社区  ›  chinloyal

Spatial/laravel permissions assignRole方法导致错误[完整性约束冲突:1452无法添加或更新子行]

  •  0
  • chinloyal  · 技术社区  · 7 年前

    我试图使用播种机将角色分配给用户,但一直出现以下错误:

    完整性约束冲突:1452无法添加或更新子行:外键约束失败( internshipweb . user_has_roles 限制 user_has_roles_role_id_foreign 外键( role_id )推荐人 roles ( id ) ...

    无法理解为什么它不起作用:

    这是我的用户模型:

    <?php
    
    namespace App\Models\Website;
    
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Spatie\Permission\Traits\HasRoles;
    
    class User extends Authenticatable
    {
        use Notifiable, HasRoles;
    
        protected $connection = 'mysql2';
    
        protected $guard = 'webuser';
    
        protected $fillable = [
            'email', 'password', 'username', 'permissions', 'first_name', 'last_name', 'avatar'
        ];
    
        protected $hidden = [
            'password'
        ];
    
    
    }
    

    这是我的播种机:

    <?php
    
    use Illuminate\Database\Seeder;
    use App\Models\Website\User;
    use Spatie\Permission\Models\Role;
    use Spatie\Permission\Models\Permission;
    
    class WebUserSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            Role::create([
                'name' => 'admin'
            ]);
    
            $user = User::create([
                'email' => 'admin@gmail.com',
                'username' => 'admin',
                'password' => bcrypt('password'),
                'first_name' => 'Add',
                'last_name' => 'Min'
            ]);
    
    
            $user->assignRole('admin');
        }
    }
    

    我尝试过清除缓存和配置。我似乎找不到有同样问题的人。如果你需要更多信息,请告诉我。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Jeff    7 年前

    您正在尝试将一行添加到 user_has_roles 有一张桌子的桌子 role_id 在你的 roles 桌子这是你的 角色 桌上种子了吗?在运行此代码之前,您需要管理员角色。如果是后来的播种者,你可以在你的工作中分配这个角色 RolesTableSeeder

        2
  •  -1
  •   d3t0x    7 年前

    出现此错误是因为您试图将一行更新为 用户_具有_角色 对于 身份证件 领域 基于当前存储在中的值 角色 .

    编辑:确保角色id作为可填充属性包含在用户角色模型中。

    这里有一个变通方法/黑客攻击,但要小心,这将禁用所有外键检查。如果所有这些都失败了,你可以:

    注意:这是一个临时解决方案,只能持续当前会话的时间。当您重新连接到数据库时,这个约束将被重新启用,这是一件好事。

    尝试在数据库上运行此查询:

    SET FOREIGN_KEY_CHECKS=0