Laravel 5.4建议通过migrate:reset?

时间:2017-05-22 08:21:03

标签: php database laravel laravel-5 laravel-5.4

我的laravel 5.4应用程序包含许多关系的复杂数据库结构,所以我很想知道在Schema::enableForeignKeyConstraints();函数中使用Schema::disableForeignKeyConstraints();down()是可以的。因为如果我运行命令 php artisan migrate:reset 那么就有关系并且删除是不可能的......

完整示例:

public function down()
{
     Schema::disableForeignKeyConstraints();
     Schema::drop('blog');
     Schema::enableForeignKeyConstraints();
}

如上所述,由于数据库功能,建议使用此方法吗?

2 个答案:

答案 0 :(得分:0)

通常,您会按特殊顺序迁移数据库,因此不会与外键发生冲突,例如: 创建:

  1. 用户
  2. 权限
  3. user_permission
  4. 当您想要进行回滚时,最好的方法是撤消所有操作,以便开始

    删除:

    1. user_permission
    2. 权限
    3. 用户
    4. 这个例子常见的错误是:

      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:resetmigrate:refresh不同。