通常、データベースは特別な順序で移行されるため、外部キーとの競合は発生しません。 作成:
- ユーザー
- 権限
- user_permissionあなたは
を開始するので、あなたは、最善の方法は、すべてのあなたの行動を逆にすることで、ロールバックをしたい
削除します。
- のuser_permission
- 権限
- ユーザー
よくある間違いは、この例です。
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
を使用することができますが、私の意見では、それは汚れた液のようなものだ、あなたがすべき同じ方法でテーブルを移行します(同じ方法で外部キーを無効にしないでください)。
down()は、migrate:rollbackによっても実行できるという問題があります。マイグレーションであることは保証されていません。すべて/ほとんどのテーブルが削除された場所をリセットします。代わりに、関連する外部キーを削除するために移行を作成してください。 – sisve