Добавить "ON DELETE CASCADE" в существующую колонку в Laravel

У меня есть столбец user_id fk в моей таблице

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

Я должен добавить в функцию каскадного удаления в этот существующий столбец. Как я могу это сделать?

Ответы

Ответ 1

Сначала мы должны сбросить внешний ключ. Благодаря Razor для этого совета

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

Ответ 2

Конструктор схем 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);'
    );
}

Ответ 3

Спасибо за ответ на вопрос. Помогите мне получить этот рабочий код в 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();
    });
}

Ответ 4

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

Ответ 5

$table->integer('user_id')->unsigned();    
$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

Я предполагаю, что вы использовали Illuminate\Database\Schema\Blueprint::primary() для создания users.id. Если это так, то users.id будет неподписанным. Поэтому ваш столбец внешнего ключа user_id также должен быть неподписанным.