как я могу исправить эту ошибку в laravel "1005 Не могу создать таблицу` englishcollage``role_user` (errno: 150 "Ограничение внешнего ключа сформировано неправильно" - PullRequest
0 голосов
/ 24 марта 2020

Я хочу выполнить миграцию ACl в моем Laravel проекте ... (версия 6)

, но я получаю эту досадную ошибку:

Общая ошибка: 1005 Не могу создать table English Collage. role_user (Errno: 150 "Ограничение внешнего ключа сформировано неправильно") ")

Engli sh Коллаж - это моя база данных.

 Schema::create('permissions', function (Blueprint $table) {

          $table->increments('id');
          $table->string('title_fa'); // edit posts
          $table->string('title_en'); //edit-posts
          $table->timestamps();
      });


    Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title_fa'); // edit posts
        $table->string('title_en'); //edit-posts
        $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');

    });

    Schema::create('permission_role', function (Blueprint $table) {

        $table->unsignedInteger('permission_id');

        $table->unsignedInteger('role_id');


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

    });

и это миграция моих пользователей:

 Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->string('image')->nullable();
            $table->string('level')->nullable();
            $table->integer('age')->nullable();
            $table->rememberToken();
            $table->timestamps();
        });

эта структура работает в laravel 5, но laravel 6 имеет проблему с этим

я пробовал большое целое число и большое целое число без знака, даже если я тестировал primary_key для role_user

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Для создания внешнего ключа тип данных для child column должен точно соответствовать parent column.

Поскольку id является bigIncrements, т.е. unsigned big integer в users таблице, то role_user.user_id должно быть unsignedbigInteger, а не unsignedInteger.

Изменить ниже в вашей role_user таблице

 $table->Integer('user_id')->unsigned();

до

 $table->unsignedBigInteger('user_id');
1 голос
/ 24 марта 2020

Скорее всего, эта строка

$table->Integer('role_id')->unsigned();

Если поле id таблицы ролей не является целым числом (последнее Laravel использует unsignedBigInteger), то MySQL не будет счастливым.

Попробуйте

$table->unsignedBigInteger('role_id');
0 голосов
/ 24 марта 2020

Попробуйте, я надеюсь, что это нормально работает

Schema::create('permissions', function (Blueprint $table) {

      $table->increments('id');
      $table->string('title_fa'); // edit posts
      $table->string('title_en'); //edit-posts
      $table->timestamps();
  });


Schema::create('roles', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title_fa'); // edit posts
    $table->string('title_en'); //edit-posts
    $table->timestamps();
});

Schema::create('role_user', function (Blueprint $table) {
   $table->Integer('role_id')->references('id')->on('roles')->onDelete('cascade')->onUpdate('cascade')->unsigned();

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

});

Schema::create('permission_role', function (Blueprint $table) {

    $table->unsignedInteger('permission_id')->references('id')->on('permissions')->onDelete('cascade')->onUpdate('cascade');

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


});
...