Перенос Laravel: добавление внешнего ключа в ту же таблицу, где ID является строкой

#laravel #migration #key

#laravel #миграция #Клавиша

Вопрос:

Я пытаюсь выполнить миграцию «категорий», где каждая категория ссылается на свою родительскую категорию по идентификатору в той же таблице.

Миграция:

     Schema::create('categories', function (Blueprint $table) {
        $table->string('id', 36)->primary();

        $table->string('parent_id', 36)->nullable();
        $table->foreign('parent_id')->references('id')->on('categories');

        $table->string('name');
    });
 

Но я получаю следующую ошибку:

Исключение IlluminateDatabaseQueryException: SQLSTATE[HY000]: Общая ошибка: 1215 Не удается добавить ограничение внешнего ключа (SQL: alter table categories add constraint categories_parent_id_foreign ссылки на внешний ключ ( parent_id ) categories id ))

Типы полей одинаковы, и я не знаю, что делать. Удаление «-> nullable()» не имеет никакого эффекта.

Платформа Laravel версии 6.20.7

Спасибо.

Комментарии:

1. У вас есть родительская таблица в базе данных?

2. Irshad, таблица одинакова, это одна миграция для всех.

3. Откорректируйте, если вы сказали о «$table-> foreign(‘parent_id’)->references(‘id’)-> on(‘categories’)-> nullable();» — нет, та же ошибка.

4. Добро пожаловать в SO … кстати, какая версия Laravel?

5. @lagbox спасибо, Laravel Framework 6.20.7

Ответ №1:

Добавьте ограничение внешнего ключа в другой прогон, как показано ниже

 public function up()
{
    Schema::create('categories', function (Blueprint $table) {
            $table->string('id', 36)->primary();

            $table->string('parent_id', 36)->nullable();

            $table->string('name');
    });

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

Комментарии:

1. Спасибо! Это странный, но работающий способ добиться этого!