Недопустимый тип смещения при назначении разрешения роли в разрешении 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.

Другие вопросы по тегам