使用UUID在spatie/lavevel权限中将权限分配给角色时,偏移量类型非法



我已经实现了使用UUID主键自定义模型的laravel权限。然后我创建了一个播种机:

$viewemployee = Permission::create(['id' => Str::uuid(), 'name' => 'view employee']);
$A = Role::create(['id' => Str::uuid(), 'name' => 'A']);

但是,当我尝试使用为角色分配权限时

$A->givePermissionTo($viewemployee);

当我运行种子时,它显示这样的错误

ErrorException偏移类型非法在vendor/laravel/framework/src/IIlluminate/Database/Eloquet/Relations/Concerns/InteractionsWithPivot>Table.php:139

然后,我尝试了另一种分配方法:

$viewemployee->assignRole($A);

但是,它显示了另一个错误:

Illuminate\Database\QueryExceptionSQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败(db.role_has_permissions,constraintrole_has_permissions_role_id_foreignforeign key(role_id(REFERENCESroles(id(ON DELETE CASCADE((SQL:插入到role_has_permissions(permission_idrole_id(值(8f98272b-cbc3-459b-abb23-fc8fa86dd199,0(

我已经正确地遵循了关于UUID和扩展的文档,但我仍然无法弄清楚我错过了什么,因此我无法运行我的种子。

成功插入了rolepermission数据,在尝试插入到role_has_permissions数据透视表时似乎遇到了问题。

以下是我对permissionsrolesrole_has_permissions表的迁移:

Schema::create($tableNames['permissions'], function (Blueprint $table) {
$table->uuid('id');
$table->string('name');
$table->string('guard_name');
$table->timestamps();
$table->primary('id');
});
Schema::create($tableNames['roles'], function (Blueprint $table) {
$table->uuid('id');
$table->string('name');
$table->string('guard_name');
$table->timestamps();
$table->primary('id');
});
Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames) {
$table->uuid('permission_id');
$table->uuid('role_id');
$table->foreign('permission_id')
->references('id')
->on($tableNames['permissions'])
->onDelete('cascade');
$table->foreign('role_id')
->references('id')
->on($tableNames['roles'])
->onDelete('cascade');
$table->primary(['permission_id', 'role_id'], 'role_has_permissions_permission_id_role_id_primary');
});

您需要将Str::uuid()强制转换为字符串(string)Str::uuid()

$viewemployee = Permission::create(['id' => (string)Str::uuid(), 'name' => 'view employee']);

否则,ID的Permission将是UUID对象,而不是UUID字符串。

最新更新