我正在使用laravel5.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
表是首先创建的,它引用了一个尚不存在的表。
编辑:
我已经更新了迁移,为每个表的外键创建了一个单独的文件。我遇到了一个错误migrate:refresh,在删除外键时发生访问冲突,我认为这是因为相同的原因:迁移是按字母顺序执行的,而不是按时间戳执行的。
更新:
我不得不重命名每一个迁移文件,现在它似乎工作。似乎migrate只关心迁移文件的命名约定中的days字段,而不是我正在处理的秒。尽管我在migrations表中看到了正确的迁移顺序,但当我有这样的迁移文件时,它会抱怨删除外键:
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');
}
我对这个解决方案不满意,但似乎只有这样。
暂无答案!
目前还没有任何答案,快来回答吧!