SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: внешний ключ - PullRequest
0 голосов
/ 10 апреля 2020

Эй, ребята, я перепробовал слишком много вещей и прочитал некоторые блоги или обсуждения. Я не решил свою проблему. Я новичок в laravel этом проекте. Я получаю сообщение об ошибке, когда хочу обновить роль этой ошибки, например

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or
update a child row: a foreign key constraint fails
(`shop`.`permission_role`, CONSTRAINT
`permission_role_permission_id_foreign` FOREIGN KEY (`permission_id`)
REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
(SQL: insert into `permission_role` (`permission_id`, `role_id`)
values (9, 17))

моя миграция

public function up()
{
    Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('title')->nullable();
        $table->timestamps();
    });
    Schema::create('permissions', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('title')->nullable();
        $table->timestamps();
    });

    Schema::create('role_user', function (Blueprint $table) {
        $table->integer('role_id')->unsigned();
        $table->integer('user_id')->unsigned();

        $table->foreign('role_id')
            ->references('id')
            ->on('roles')
            ->onDelete('cascade')
            ->onUpdate('cascade');

        $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade')
            ->onUpdate('cascade');

        $table->primary(['role_id','user_id']);
    });

    Schema::create('permission_role', function (Blueprint $table) {
        $table->integer('role_id')->unsigned();
        $table->integer('permission_id')->unsigned();


        $table->foreign('role_id')
            ->references('id')
            ->on('roles')
            ->onDelete('cascade')
            ->onUpdate('cascade');

        $table->foreign('permission_id')
            ->references('id')
            ->on('permissions')
            ->onDelete('cascade')
            ->onUpdate('cascade');
        $table->primary(['permission_id','role_id']);
    });


}

мой контроллер

 public function store(Request $request)
{

    $role=Role::create([
        'name'=>$request['name'],
        'title'=>$request['title'],
    ]);
    $role->permissions()->sync($request->input(['permission_id']));
    return redirect(route('role.index'));

}

представление:

<select name="permission_id[]" id="" multiple > 
  @foreach($permissions as $permission) 
    <option value="{{$permission->id}}"> {{$permission->title}} </option> 
  @endforeach 
</select>

1 Ответ

1 голос
/ 10 апреля 2020

При миграции для ваших сводных узлов добавляются составные первичные ключи:

$table->primary(['role_id','user_id']);
$table->primary(['permission_id','role_id']);

Это не то же самое, что добавление внешних ключей. Вам не нужен первичный ключ для них, но если вы хотите его получить, я предлагаю вам добавить его с помощью обычного increments метода:

$table->increments('id');

Попробуйте вынуть эти составные ключи из двух сводных таблицы и перезапустите ваши миграции. Затем попробуйте снова создать пользователя и добавить роли этому пользователю.

...