Миграции не следуют за меткой времени - PullRequest
0 голосов
/ 23 мая 2018

Я работаю с 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');
}

Я не доволен этим решением, но, похоже, оно работает только таким образом.

...