Laravel Migration Две зависимости внешнего ключа для двух таблиц

У меня есть две таблицы (сотрудники, а также регионы),

сотрудники и регионы

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

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table regions` add constraint regions_create_by_foreign foreign key (`create_by`) references `employees` (`id`))

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

Ниже мой код миграции:

FILE: 2014_10_11_052414_create_regions_table.php  //this is the migration file for regions

Schema::create('regions', function(Blueprint $table)
{
$table->increments('id');
$table->string('name',50)->unique();
$table->integer('head_office_flag');
$table->integer('create_by')->unsigned();
$table->foreign('create_by')->references('id')->on('employees'); //this is the problem
$table->datetime('create_datetime')->default(DB::raw('CURRENT_TIMESTAMP'));
});

FILE: 2014_10_12_110447_create_employees_table.php //this is the migration file for employees

Schema::create('employees', function(Blueprint $table)
{
$table->increments('id');
$table->string('first_name',50);
$table->string('surname',50);
$table->string('email',100);
$table->integer('region_id');
$table->string('photos',255)->nullable();
$table->string('mobile_no',50);
$table->string('office_no',50)->nullable();
$table->string('landline_no',50)->nullable();
$table->integer('create_by')->unsigned();
$table->foreign('create_by')->references('id')->on('employees'); //this is the problem to reference to itself
$table->datetime('create_datetime')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->integer('status');
});

Мои вопросы:

  • мне нужно изменить последовательность миграции? учитывая, что оба имеют внешний ключ друг к другу. * Обратите внимание, я попытался изменить последовательность, переименовав файл и используя более раннюю временную метку в имени файла

  • какой дополнительный код я должен добавить?

  • я должен добавить дополнительный код в моей сеялке?

Заранее спасибо! Приветствия.

ОБНОВИТЬ

@Marcin: я обновил его до:

FILE: 2014_10_11_052414_create_regions_table.php

Schema::create('regions', function(Blueprint $table)
{
$table->increments('id');
$table->string('name',50)->unique();
$table->integer('head_office_flag');
$table->integer('create_by')->unsigned();
$table->datetime('create_datetime')->default(DB::raw('CURRENT_TIMESTAMP'));
});

FILE: 2014_10_11_110447_create_employees_table.php

Schema::create('employees', function(Blueprint $table)
{
$table->increments('id');
$table->string('first_name',50);
$table->string('surname',50);
$table->string('email',100);
$table->integer('region_id')->unsigned();
$table->string('photos',255)->nullable();
$table->string('mobile_no',50);
$table->string('office_no',50)->nullable();
$table->string('landline_no',50)->nullable();
$table->integer('create_by')->unsigned();
$table->datetime('create_datetime')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->integer('status');
});

FILE: 2014_10_12_065402_alter_regions_table_FK.php

Schema::table('regions', function($table)
{
$table->foreign('create_by')->references('id')->on('employees');
});

FILE: 2014_10_12_070219_alter_employees_table_FK.php

Schema::table('employees', function($table)
{
$table->foreign('region_id')->references('id')->on('regions');
$table->foreign('create_by')->references('id')->on('employees');
});

Я все еще получаю ошибку:

![Ошибка] [2]

введите описание изображения здесь

2

Решение

Если у вас есть 2 таблицы, ссылающиеся друг на друга (или внешний ключ в таблице ссылается на одну и ту же таблицу), вы должны сделать:

  1. создать миграцию для 1-й таблицы — здесь вы не используете внешние ключи
  2. создать миграцию для 2-й таблицы — здесь не используются внешние ключи
  3. создать миграцию для 1-й таблицы — здесь вы добавляете только внешние ключи
  4. создать миграцию для 2-й таблицы — здесь вы добавляете только внешние ключи

Конечно, вы можете объединить, например, 3-й и 4-й шаг, но, вероятно, лучше разделить их для удобства чтения

3

Другие решения

Других решений пока нет …