Laravel Schema onDelete设置为null


112

无法弄清楚如何在Laravel中的表上设置适当的onDelete约束。(我正在使用SqLite)

$table->...->onDelete('cascade'); // works
$table->...->onDelete('null || set null'); // neither of them work

我进行了3次迁移,创建了Gallery表:

Schema::create('galleries', function($table)
{
    $table->increments('id');
    $table->string('name')->unique();
    $table->text('path')->unique();
    $table->text('description')->nullable();
    $table->timestamps();
    $table->engine = 'InnoDB';
});

创建图片表:

Schema::create('pictures', function($table)
{
    $table->increments('id');
    $table->text('path');
    $table->string('title')->nullable();
    $table->text('description')->nullable();
    $table->integer('gallery_id')->unsigned();
    $table->foreign('gallery_id')
        ->references('id')->on('galleries')
        ->onDelete('cascade');
    $table->timestamps();
    $table->engine = 'InnoDB';
});

将图库表链接到图片:

Schema::table('galleries', function($table)
{
    // id of a picture that is used as cover for a gallery
    $table->integer('picture_id')->after('description')
        ->unsigned()->nullable();
    $table->foreign('picture_id')
        ->references('id')->on('pictures')
        ->onDelete('cascade || set null || null'); // neither of them works
});

我没有收到任何错误。同样,即使“层叠”选项也不起作用(仅在图库表上)。删除图库会删除所有图片。但是删除封面图片,不会删除图库(出于测试目的)。

因为甚至没有触发“级联”,所以我“设置为空”不是问题。

编辑(解决方法):

阅读本文后,我对架构进行了一些更改。现在,图片表包含一个“ is_cover”单元格,该单元格指示该图片是否是其专辑的封面。

解决原始问题的方法仍然受到高度赞赏!

Answers:


317

如果要在删除时设置null:

$table->...->onDelete('set null');

首先,请确保将外键字段设置为可为空:

$table->integer('foreign_id')->unsigned()->nullable();

37
加上->nullable()
mohsenJsh '16

3
是否有一些Laravel文档?
Chuck Le Butt

laravel.com/docs/6.x/migrations#foreign-key-constraints它没有记录有什么选项,但是我认为您可以假设它是默认的mysql值(请参阅../ vendor / laravel / framework / src / Illuminate / Database / Schema / Grammars / Grammar.php
Dirk Jan

6
  • 这是Laravel中的一个已知问题。关于这方面更多的信息在这里

  • SQLite不支持此功能,请参见此处

  • 另外一个话题是有这个问题的详细对决


1
@SimonBengtsson问题必须已关闭或删除。
MK

5

根据

http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html

$ table-> onDelete('set null')应该可以尝试一下

$table->...->onDelete(DB::raw('set null'));

如果有任何错误,也会有帮助


您可能需要回滚,手动写出sql,然后在本地执行并运行测试。我发现的所有内容都可以正常运行dev.mysql.com/doc/refman/5.6/en / ...,可能是生成sql的问题
Chris Barrett

谢谢!不幸的是,它导致了同样的问题。我认为这是SqLite和循环引用所特有的。
MK

加一是因为onDelete('set null')与mysql一起使用。
西蒙·本格森

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.