在 Laravel 中的现有列中添加“ON DELETE CASCADE”

问题描述 投票:0回答:10

我的表中有 user_id fk 列

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

我应该将 on cascade delete 特性添加到这个现有的列中。我该怎么做?

php laravel laravel-4 database-migration
10个回答
153
投票

先删除外键。感谢 Razor 的提示

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

13
投票

在我的例子中,我需要将 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 版本


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

5
投票

Laravel 模式生成器无法修改当前状态的列,因此您将使用原始查询。您将不得不删除并重新创建 constraint:

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

5
投票

感谢问题解答。帮助我获得 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();
    });
}

1
投票

在当前迁移中使用无符号函数

user_id

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

1
投票

laravel 7.0
开始,您可以使用
$table->foreignId('user_id');
它是
$table->unsignedBigInteger('user_id');

的别名

所以我们的外键列删除级联的oneline解决方案如下:

$table->foreignId('user_id')->constrained('users')->onDelete('cascade');

0
投票
$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
也必须未签名。


0
投票

小代码

$table->foreignId('user_id')->constrained('users');

0
投票

这是创建外键关系的更好方法

$table->unsignedBigInteger('product_id');
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');

© www.soinside.com 2019 - 2024. All rights reserved.