laravel errno: 150 "Ограничение внешнего ключа сформировано неправильно - PullRequest
1 голос
/ 29 апреля 2019

I пользователь ниже учебник для категорий Laravel:

Категории Laravel с динамическими глубокими путями

Я использую ниже тот же учебник для миграции:

public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->string('slug');
            $table->integer('parent_id')->unsigned()->default(0);
            $table->timestamps();
        });

        Schema::table('categories', function (Blueprint $table) {
            $table->foreign('parent_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
        });

    }

но у меня ниже ошибка:

SQLSTATE[HY000]: General error: 1005 Can't create table 'xxx'.'#sql-453_147' (errno: 150 "Foreign key constraint is incorrectly formed")
(SQL: alter table 'categories' add constraint 'categories_parent_id_foreign' foreign key ('parent_id') references 'categories' ('id') on delete cascade on update cascade)

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

При создании новой таблицы в Laravel. Миграция будет сгенерирована как:

$table->bigIncrements('id');

Вместо (в старых версиях Laravel):

$table->increments('id');

При использовании bigIncrements внешний ключ ожидает bigInteger вместо целого числа. Итак, ваш код будет выглядеть так:

public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->string('slug');
            $table->bigInteger('parent_id')->unsigned()->default(0);
            $table->timestamps();
        });

        Schema::table('categories', function (Blueprint $table) {
            $table->foreign('parent_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
        });

    }
0 голосов
/ 29 апреля 2019

Проблема заключается в различии типов столбцов.Таким образом, в отличие от учебника, вы используете bigIncrements, что означает большое целое число для идентификатора и используется целое число по умолчанию для parent_id.Попробуйте изменить id на это:

$table->increments('id');

или parent_id на это:

$table->bigInteger('parent_id')->unsigned()->default(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...