Php Laravel 5.4建议使用;启用/禁用ForeignKeyConstraints();通过迁移:重置?
我的laravel 5.4应用程序包含复杂的数据库结构和许多关系,因此我愿意知道使用Php Laravel 5.4建议使用;启用/禁用ForeignKeyConstraints();通过迁移:重置?,php,database,laravel,laravel-5,laravel-5.4,Php,Database,Laravel,Laravel 5,Laravel 5.4,我的laravel 5.4应用程序包含复杂的数据库结构和许多关系,因此我愿意知道使用Schema::enableForeignKeyConstraints()是可以的和模式::disableForeignKeyConstraints()在down()函数中。因为如果我运行命令php artisan migrate:reset,则存在关系,并且无法删除 完整示例: public function down() { Schema::disableForeignKeyConstraints(
Schema::enableForeignKeyConstraints()是可以的代码>和模式::disableForeignKeyConstraints()代码>在down()函数中。因为如果我运行命令php artisan migrate:reset,则存在关系,并且无法删除
完整示例:
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::drop('blog');
Schema::enableForeignKeyConstraints();
}
如前所述,由于数据库功能的原因,建议使用此选项?通常情况下,您会按照特殊顺序迁移数据库,以便不会与外键发生冲突,例如。
创建:
使用者
权限
用户权限
当您想要执行回滚时,最好的方法是反转所有操作,因此您可以开始
删除:
用户权限
权限
使用者
一个常见的错误是以下示例:
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
,但我认为这是一种肮脏的解决方案,您应该遵循迁移表的相同方式(相同方式=不禁用外键)。这是一个有效的用例。长期以来,这一直是laravel迁移的一个大问题。您需要确保删除表的顺序在删除父表之前先删除相关表。对于大量迁移,这可能会变得非常乏味。因此,在删除前强制禁用外键约束是有效的。尽管您需要小心,因为您可能会错误地放弃具有现有关系的单个迁移。这会引起大问题
Laravel5.5附带了一个新命令migrate:fresh
。这将有助于在再次迁移之前清理数据库,不像现有的导致外键问题的migrate:reset
或migrate:refresh
那样;在删除所有/大多数表的情况下,不能保证它是一个migrate:reset。只需编写迁移以删除相关外键即可。