58

移行をロールバックしようとしています。

私の移行ファイルはそのように外部キーを使用しています

$table->foreign('user_one')->references('id')->on('users');
$table->foreign('user_two')->references('id')->on('users');

私の down() 関数はそうです

public function down()
{
    Schema::drop('pm_convo');
    Schema::drop('pm_convo_replys');
}

移行コマンドを実行すると

php artisan migrate:refresh --seed --env=local

次のエラーが表示されます

SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table `pm_convo`) 

これを修正するために何をすべきか正確にはわかりません。

編集:

私が試してみました:$table->dropForeign('pm_convo_user_one_foreign');

しかし、それでもエラーが発生します

4

7 に答える 7

83

これはそれを行うためのより良い方法だと思います:

public function down()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    Schema::dropIfExists('tableName');
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
于 2013-09-03T10:38:44.433 に答える
75

pm_convo_replysには を参照する外部キーがあるため、 の外部キー制約に違反しない限り、最初に削除することはできませpm_convoん。pm_convopm_convo_replys

両方を削除するには、最初に削除pm_convo_replysする必要があります。

public function down()
{
    Schema::drop('pm_convo_replys');
    Schema::drop('pm_convo');
}
于 2013-06-14T13:33:54.563 に答える
37

このような問題にも直面しました。ここでの主な問題は、移行ファイルの順序です。最適な方法は、移行ファイルを 1 つずつ作成することです。メイン エンティティを最初に作成する必要があります。移行は、移行ファイルを作成するたびに更新する必要があります。(とphp artisan migrate:refresh)

@abkrim と @Eric によると

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

またはより安全:

protected function dropColumn($table, $column) {
    try {
        Schema::disableForeignKeyConstraints();
        Schema::table($table, function (Blueprint $tbl) use ($column) {
            $tbl->dropColumn($column);
        });
    } catch (Illuminate\Database\QueryException $e)
    {
        Schema::table($table, function (Blueprint $tbl) use ($column) {
            $tbl->dropConstrainedForeignId($column);
        });
    } finally {
        Schema::enableForeignKeyConstraints();
    }
}

public function down() {
    $this->dropColumn('users', 'foreign_column');
}
于 2017-01-01T17:35:27.433 に答える
3

このようにすることを好む

    Schema::dropIfExists('tableNameChild');
    Schema::drop('tableNameParents');
于 2015-07-06T20:06:12.820 に答える