16

herecascade中所述,我们可以在迁移中建立关系时使用该词,
但我想知道他们在何时deletingupdating外键时没有提及其他操作,

所以我不确定是否存在这样的事情:

$table->foreign('user_id')
  ->references('id')->on('users')
  ->onDelete('set null');
  //->onDelete('set_null');
  //->onDelete('setNull');

或者同样的事情onUpdateno action就像phpMyAdmin

在此处输入图像描述


谢谢

4

3 回答 3

32

您可以通过这种方式执行所有提到的选项phpmyadmin

$table->...->onDelete('CASCADE');
$table->...->onDelete('SET NULL');
$table->...->onDelete('RESTRICT');

// do not call the onDelete() method if you want the RESTRICT option.

您必须确保将外键字段设置为可为空:

$table->...->unsigned()->nullable();
于 2016-09-15T19:15:34.777 回答
4

参考源代码:

`vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php` in the function compileForeign()

它只是将您传入的任何内容附加到表查询中。

    if (! is_null($command->onDelete)) {
        $sql .= " on delete {$command->onDelete}";
    }

    if (! is_null($command->onUpdate)) {
        $sql .= " on update {$command->onUpdate}";
    }

因此,请确保您通过以下其中一项:“cascade”、“no action”、“restrict”或“set null”

注意:请勿“set_null”和“no_action”等操作中使用下划线

于 2019-08-05T17:37:16.883 回答
4

onUpdate 也可用


$table->foreign('user_id')->references('id')->on('users')
->onDelete('SET NULL')
->onUpdate('SET NULL'); // also available CASCADE, RESTRICT, DO NOTHING, NO ACTION

要使用“SET NULL”,您必须确保字段可以为空

$table->integer('user_id')->nullable();

于 2020-10-07T11:27:21.270 回答