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

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

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

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

7 ответов


сначала мы должны удалить внешний ключ. Спасибо бритвы за этот совет

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

Laravel schema builder не может изменять столбцы в текущем состоянии, поэтому вы будете использовать необработанные запросы. Вам придется отбросить и воссоздать ограничения:

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);'
    );
}

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

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

$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 также должно быть без знака.


ответ Фарида Мовсумова сработал для меня. Вы должны проверить "answers_user_id_foreign" в структуре MySQL. Ниже в phpmyadmin находится таблица под названием indexes, где вы найдете свой эквивалент


в моем случае мне нужно будет поместить имя col в массив, иначе это будет ошибкой.

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