在进行laravel迁移时,我面临一些小小的不便。我使用Laravel 5.1。
由于存在许多具有许多关系的表,因此我可能无法重命名迁移文件,因此它们以正确的顺序运行,因此不会违反外键约束。这就是我过去做过的事情,而且非常不实用。
我现在正在做的是定义每次迁移:
class CreateSomeTable extends Migration
{
public function up()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
// my table definitions go here
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
// drop table
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
}
}
这个问题在于它编写起来很繁琐,而且代码也很混乱。
我还考虑过创建两个虚拟迁移文件,其唯一目的是启用和禁用外键检查,我会以它们在开头和结尾运行的方式命名它们。每次迁移。
如果有一个优雅的解决方案,是否可以将它应用于播种过程,因为这也是一个问题。
这显然是一个非常即兴的解决方案,我想问是否有更好的方法。是否有一些我可以覆盖的beforeMigrate
和afterMigrate
方法或类似的方法?
如果没有,你会怎么做呢?
任何见解都会受到赞赏,我不喜欢我所说的所有选项。
答案 0 :(得分:24)
当Lumen / Laravel开始使用Passport时,我手头有类似的任务,我不得不放弃lucadegasperi/oauth2-server-laravel以前的oauth服务器实现。
我终于通过创建2次迁移来实现目标,其中第一次清除外键,第二次实际删除表。
我必须在Laravel's Passport(2016-06-01)的迁移之前使用日期,因此它们将在这些之前执行。
2016_05_31_000000_clear_old_oauth_relations.php
//...
class ClearOldOauthRelations extends Migration
{
public function up()
{
Schema::disableForeignKeyConstraints();
// drop foreign keys
Schema::table('oauth_access_tokens', function (BluePrint $table) {
$table->dropForeign('oauth_access_tokens_session_id_foreign');
});
//...
Schema::enableForeignKeyConstraints();
}
//...
}
在第二个文件中
2016_05_31_000001_clear_old_oauth.php
//...
public function up()
{
Schema::disableForeignKeyConstraints();
Schema::drop('oauth_access_tokens');
//...
Schema::enableForeignKeyConstraints();
}
//...
答案 1 :(得分:2)
我通过将外键逻辑解压缩到单独的迁移文件中来完成此操作。这帮助我:
在代码中:
//file: 2017_06_19_230601_fk_postuser_table.php
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('post_user');
}
答案 2 :(得分:0)
要记住的另一个重要方面是删除foreignKey FIRST,然后删除列。首先删除列会引发错误:
Cannot drop index 'tableName_columnName_foreign': needed in a foreign key constraint
正确的顺序很重要:
public function down()
{
Schema::table('tableName', function (Blueprint $table) {
$table->dropForeign(['columnName']); // fk first
$table->dropColumn('columnName'); // then column
});
}
答案 3 :(得分:0)
有时最好的方法是始终在回滚迁移代码中删除创建的外键。
假设您在up
模式中具有外键,如下所示:
Schema::table('mytable', function (Blueprint $table) {
$table->foreign(mycolumn)->references('id')->on(foreigntable);
}
在down
迁移中,您应该拥有
$table->dropForeign(mytable_mycolumn_foreign);//this is how laravel generates the foreign keys