2017-05-22 4 views
0

私のlaravel 5.4アプリには多くの関係を持つ複雑なデータベース構造が含まれていますので、Schema::enableForeignKeyConstraints();Schema::disableForeignKeyConstraints();down()の機能で使用することは問題ありません。私は、コマンドPHPの職人の移行を実行する場合ので:がそこ関係があり、削除、リセット...Laravel 5.4移行によって "enable/disableForeignKeyConstraints()"を使用することをお勧めします。

完全な例では不可能である。説明したように

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

このため、データベース機能を使用することをお勧めしますか?

+0

down()は、migrate:rollbackによっても実行できるという問題があります。マイグレーションであることは保証されていません。すべて/ほとんどのテーブルが削除された場所をリセットします。代わりに、関連する外部キーを削除するために移行を作成してください。 – sisve

答えて

0

通常、データベースは特別な順序で移行されるため、外部キーとの競合は発生しません。 作成:

  1. ユーザー
  2. 権限
  3. user_permissionあなたは

    を開始するので、あなたは、最善の方法は、すべてのあなたの行動を逆にすることで、ロールバックをしたい

削除します。

  1. のuser_permission
  2. 権限
  3. ユーザー

よくある間違いは、この例です。

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を使用することができますが、私の意見では、それは汚れた液のようなものだ、あなたがすべき同じ方法でテーブルを移行します(同じ方法で外部キーを無効にしないでください)。

0

これは有効な使用例です。これは長い間、ラーベル移行の大きな問題でした。ドロップテーブルの順序は、親テーブルを削除する前に関連するテーブルを先に削除するようにする必要があります。これは、多数の移行によって非常に退屈になる可能性があります。したがって、ドロップする前に外部キーの制約を無効にすることが有効です。誤って既存の関係を持つ個々の移行を削除することができるので、注意する必要があります。これは大きな問題を引き起こす可能性があります。

Laravel 5.5には新しいコマンドmigrate:freshが付属しています。これにより、外部キーの問題を引き起こす既存のmigrate:resetまたはmigrate:refreshとは異なり、移行前にデータベースをクリーンアップするのに役立ちます。

関連する問題