我正在使用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');
}
我对这个解决方案不满意,但似乎只是这样做。