Я работаю с Laravel 5.4, пытаясь запустить мои миграции.Я прочитал, что порядок выполнения соответствует временным меткам файлов миграции.Но это не так, так как я получаю следующую ошибку:
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
(SQL: alter table `aplicantes` add constraint `aplicantes_pais_id
_foreign` foreign key (`pais_id`) references `pais` (`id`))
Это мои файлы миграции:
2014_01_01_100004_create_pais_table.php
2014_01_01_100005_create_departamentos_table.php
2014_01_01_100006_create_aplicantes_table.php
И вот здесь миграция жалуется:
class CreateAplicantesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('aplicantes', function (Blueprint $table) {
$table->increments('id');
$table->string('nombre');
$table->unsignedInteger('pais_id');
$table->foreign('pais_id')->references('id')->on('pais');
$table->timestamps();
});
}
}
Это моя миграция Pais:
public function up()
{
Schema::create('pais', function (Blueprint $table) {
$table->increments('id');
$table->string('nombre');
$table->timestamps();
});
}
Когда я проверяю базу данных, создается только таблица aplicantes
, которая является третьей в порядке.Я думаю, именно поэтому миграция завершается неудачно, потому что сначала создается таблица aplicantes
, которая ссылается на таблицу, которая еще не существует.
EDIT :
Iобновил мои миграции, создав индивидуальный файл для внешних ключей каждой таблицы.Я получаю сообщение об ошибке при переносе: обновление, нарушение доступа при удалении внешнего ключа, и я предполагаю, что это происходит по той же причине: миграция выполняется в алфавитном порядке, а не по отметке времени.
ОБНОВЛЕНИЕ :
Мне пришлось переименовывать каждый файл миграции, и теперь он, кажется, работает.Кажется, что миграция заботится только о поле дней в соглашении об именах файлов миграции, а не о секундах, с которыми я работал.Несмотря на то, что я вижу правильный порядок миграции в таблице миграции, он жалуется на удаление внешних ключей, когда у меня есть такой файл миграции:
class AddAplicantesForeignKey extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('aplicantes', function (Blueprint $table) {
$table->foreign('pais_id')->references('id')->on('pais')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('aplicantes', function(Blueprint $table)
{
$table->dropForeign('pais_id');
});
}
}
Мне удается отключить жалобыпутем отключения проверки ограничений внешнего ключа в моей таблице создания миграции:
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('aplicantes');
}
Я не доволен этим решением, но, похоже, оно работает только таким образом.