我的laravel 5.4应用程序包含许多关系的复杂数据库结构,所以我很想知道在Schema::enableForeignKeyConstraints();
函数中使用Schema::disableForeignKeyConstraints();
和down()
是可以的。因为如果我运行命令 php artisan migrate:reset 那么就有关系并且删除是不可能的......
完整示例:
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::drop('blog');
Schema::enableForeignKeyConstraints();
}
如上所述,由于数据库功能,建议使用此方法吗?
答案 0 :(得分:0)
通常,您会按特殊顺序迁移数据库,因此不会与外键发生冲突,例如: 创建:
当您想要进行回滚时,最好的方法是撤消所有操作,以便开始
删除:
这个例子常见的错误是:
class User extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('username')->nullable()->unique();
$table->timestamps();
});
Schema::create('user_permission', function (Blueprint $table) {
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->integer('permission_id')->unsigned();
$table->foreign('permission_id')->references('id')->on('permissions');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users'); // error will be thrown, because user_permission still exists.
Schema::dropIfExists('user_permission');
}
}
当然你可以使用disableForeignKeyConstraints
,但在我看来,这是一种肮脏的解决方案,你应该采用与迁移表格相同的方式(同样的方法=不要禁用外键) )。
答案 1 :(得分:0)
这是一个有效的用例。这是长期以来laravel迁移的一个大问题。您需要确保drop table的顺序在删除父表之前首先删除相关表。对于大量迁移,这可能变得非常繁琐。因此,在删除之前强制禁用外键约束是有效的。虽然您需要小心,因为您可以错误地删除与现有关系的单个迁移。这可能会导致很大的问题。
Laravel 5.5将带来一个新命令migrate:fresh
。这有助于在再次迁移之前清理数据库,这与导致外键问题的现有migrate:reset
或migrate:refresh
不同。