迁移不遵循时间戳顺序

时间:2018-05-23 18:12:35

标签: mysql laravel laravel-5 migration laravel-migrations

我正在使用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表,它引用了一个尚不存在的表。

修改

我更新了我的迁移,为每个表的外键创建了一个单独的文件。我在迁移时遇到错误:刷新,丢弃外键时发生访问冲突,我之所以认为原因相同:迁移按字母顺序执行,而不是按时间戳执行。

更新

我不得不重命名每个迁移文件,现在它似乎正在运行。似乎只迁移迁移文件的命名约定中的days字段,而不是像我一样工作的秒。 尽管我在迁移表中看到了正确的迁移顺序,但是当我有这样的迁移文件时,它会抱怨丢弃外键:

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');
}

我对这个解决方案不满意,但似乎只是这样做。

0 个答案:

没有答案