Errno: 150 "Миграция Laravel Ограничение внешнего ключа сформировано неправильно" - PullRequest
0 голосов
/ 08 октября 2018

Код для пользователей

    public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->integer('role_id')->unsigned();
        $table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');
        $table->rememberToken();
        $table->timestamps();
    });
}

Код для пользовательских ролей

    public function up()
{
    Schema::create('user_roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('user_role');
        $table->timestamps();
    });
}

SQLSTATE [HY000]: общая ошибка: 1005 Не удается создать таблицу sms. #sql-1718_62 (errno: 150 «Ограничение внешнего ключа сформировано неправильно») (SQL: изменить таблицу users добавить ограничение users_role_id_foreign ссылки на внешний ключ (role_id) user_role (id) при каскаде удаления)

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

имя таблицы, которую вы передаете, неверно.Это должно быть user_roles, а не user_role, поскольку вы создали таблицу с именем user_roles

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->integer('role_id')->unsigned();
    $table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade');
    $table->rememberToken();
    $table->timestamps();
});
0 голосов
/ 08 октября 2018

Эта проблема неясна.Это также может произойти, если тип ссылочного столбца и столбца внешнего ключа отличается.

, например, если столбец внешнего ключа был SMALLINT(5) UNSIGNED, а указанный столбец - INT(10) UNSIGNED.

0 голосов
/ 08 октября 2018

В вашем коде здесь:

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

вы ссылаетесь на user_role таблицу, но у вас нет этой таблицы, у вас есть user_roles таблица, поэтому сделайте user_roleto user_roles

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

Надеюсь, это решит вашу проблему

0 голосов
/ 08 октября 2018

Если вы хотите сослаться на внешний ключ, пожалуйста, не создавайте его с

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

, вместо этого вы должны использовать

$table->unsignedInteger('role_id');

Это связано с документами из части миграции: Laravel Migrations .

Таким образом, ваше новое утверждение должно выглядеть так:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->unsignedInteger('role_id');
        $table->foreign('role_id')->references('id')->on('user_role')->onDelete('cascade');
        $table->rememberToken();
        $table->timestamps();
    });
}

Редактировать:

После того, как автор добавил код миграции user_role таблица проблема ясна.

Таблица, на которую ссылается автор, называется user_roles , а не как указано в миграции внешнего ключа user_role .

Итак, вот миграция, которая должна работать для таблицы users .

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->unsignedInteger('role_id');
        $table->foreign('role_id')->references('id')->on('user_roles')->onDelete('cascade'); // change this line
        $table->rememberToken();
        $table->timestamps();
   });
 }

Именование связано с соглашением об именовании Laravel, в котором все таблицы названы во множественном числе, а все модели названы в единственном числе.

Edit 2:

OP упомянул, что у него были миграции в неправильном порядке, что было причиной неработающей миграции.

Таблица users создана перед таблицей user_roles .Вот почему внешний ключ вызывает ошибку.

Надеюсь, это поможет вам!Если у вас возникли проблемы, пожалуйста, дайте мне знать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...