Php Laravel 5.4建议使用;启用/禁用ForeignKeyConstraints();通过迁移:重置?

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(

我的laravel 5.4应用程序包含复杂的数据库结构和许多关系,因此我愿意知道使用
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。只需编写迁移以删除相关外键即可。