spatie / laravel-permissions assignRole方法导致错误[完整性约束违规:1452无法添加或更新子行]

时间:2018-05-22 16:40:26

标签: php laravel laravel-5.4

我尝试使用播种机为用户分配角色,但我不断收到此错误:

  

完整性约束违规:1452无法添加或更新子行:外键约束失败(internshipwebuser_has_roles,CONSTRAINT user_has_roles_role_id_foreign FOREIGN KEY(role_id)参考rolesid)...

无法弄清楚为什么它不起作用:

这是我的用户模型:

<?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 个答案:

答案 0 :(得分:0)

您正试图在user_has_roles表格中添加一行,其中role_id表格中不存在roles。您的roles表是否播种了吗?在此代码运行之前,您需要存在admin角色。如果它是以后的播种机,您可以在RolesTableSeeder

中指定该角色

答案 1 :(得分:-1)

您收到此错误是因为您尝试将行更新为 user_has_roles ,而该行没有 id 字段的有效值 基于当前存储在角色中的值。

编辑:确保将role_id作为可填写属性包含在user_has_roles模型中。

这是一个解决方法/ hack但要小心这将禁用所有外键检查。如果一切都失败了,你可以:

请注意,这是一种临时解决方法,只能持续当前会话的长度。当您重新连接到数据库时,将重新启用此约束,这是一件好事。

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

SET FOREIGN_KEY_CHECKS=0