Недопустимый тип смещения при назначении разрешения роли в разрешении spatie/laravel с использованием UUID
Я реализовал разрешение laravel для настройки моей модели с использованием первичного ключа UUID. Затем создал сеялку:
$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/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivot>Table.php:139
Затем я попробовал назначить другой способ:
$viewemployee->assignRole($A);
Но это показывает другую ошибку:
Illuminate\Database\QueryExceptionSQLSTATE[23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (
db
.role_has_permissions
, ОГРАНИЧЕНИЕrole_has_permissions_role_id_foreign
ВНЕШНИЙ КЛЮЧ (role_id
) ССЫЛКИroles
(id
) ON DELETE CASCADE) (SQL: вставить вrole_has_permissions
(permission_id
,role_id
) значения (8f98272b-cbc3-459b-ab23-fc8fa86dd199, 0))
Я правильно следил за документацией по UUID и расширению, но до сих пор не могу понять, что мне не хватает, поэтому я не могу запустить свое семя.
role
а также permission
данные успешно вставлены, похоже, возникла проблема при попытке вставить в role_has_permissions
сводная таблица.
Вот моя миграция для permissions
, roles
а также role_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');
});
1 ответ
Вам нужно бросить
Str::uuid()
в строку
(string)Str::uuid()
$viewemployee = Permission::create(['id' => (string)Str::uuid(), 'name' => 'view employee']);
В противном случае идентификаторы
Permission
будет объектом UUID вместо строки UUID.