web-dev-qa-db-ja.com

「= DELETE CASCADE」を既存の列にLaravel

テーブルにuser_id fk列があります

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

この既存の列にカスケード削除時機能を追加する必要があります。これどうやってするの?

27
Farid Movsumov

最初に外部キーをドロップします。 Razor に感謝します

$table->dropForeign('answers_user_id_foreign');
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
61
Farid Movsumov

Laravelスキーマビルダーは現在の状態では列を変更できないため、生のクエリを使用します。 制約をドロップして再作成する必要があります。

PostgreSQL

function up()
{
    DB::statement('alter table answers drop constraint answers_user_id_foreign,
                   add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id)
                   on delete cascade;'
    );
}
function down()
{
    DB::statement('alter table answers drop constraint answers_user_id_foreign,
                   add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id);'
    );
}

MySQL

function up()
{
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
    DB::statement('alter table answers add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id)
                   on delete cascade;'
    );
}
function down()
{
    DB::statement('alter table answers drop FOREIGN KEY answers_user_id_foreign;');
    DB::statement('alter table answers add constraint answers_user_id_foreign
                   foreign key (user_id)
                   references users(id);'
    );
}
4
Razor

私の場合、エラーになる配列に列名を入れる必要があります。

Schema::table('transactions', function (Blueprint $table) {
    $table->dropForeign(['transactions_order_id_foreign']);
    $table->foreign('order_id')
        ->references('id')->on('orders')
        ->onDelete('cascade')
        ->change();
});

mysql 5.7 ver

2
shalonteoh

質問にお答えいただきありがとうございます。 L5.1のこの作業コードを手伝ってください:

public function up()
{
    Schema::table('transactions', function (Blueprint $table) {
        $table->dropForeign('transactions_order_id_foreign');
        $table->foreign('order_id')
            ->references('id')->on('orders')
            ->onDelete('cascade')
            ->change();
    });

    Schema::table('orders', function (Blueprint $table) {
        $table->dropForeign('orders_user_id_foreign');
        $table->foreign('user_id')
            ->references('id')->on('users')
            ->onDelete('cascade')
            ->change();
    });
}
2
JohnWolf
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');
2
Mark Baker
_$table->integer('user_id')->unsigned();    
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');
_

_users.id_を作成するためにIlluminate\Database\Schema\Blueprint::primary()を使用したと仮定しています。その場合、_users.id_は符号なしになります。したがって、外部キー列_user_id_も署名されていない必要があります。

0
Inda5th

Farid Movsumovの答えは私のために働いた。 MySQL構造で「answers_user_id_foreign」を確認する必要があります。下のphpmyadminにはインデックスと呼ばれるテーブルがあり、同等のテーブルがあります

0
Sallmin Rexha

現在の移行では、user_idに符号なし関数を使用します。

$table->interger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('table_name')->onDelete('cascade');
0
Detroit Charan