无法弄清楚如何在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
});
我没有收到任何错误。此外,即使“级联”选项也不起作用(仅在图库表上)。删除图库会删除所有图片。但删除封面图片,不会删除图库(用于测试目的)。
由于即使“级联”未被触发,我“设置空”也不是问题。
编辑(解决方法):
阅读此article后,我稍微改变了我的架构。现在,图片表包含一个“is_cover”单元格,用于指示此图片是否是其相册的封面。
原始问题的解决方案仍然受到高度赞赏!
答案 0 :(得分:240)
如果要在删除时设置null:
$table->...->onDelete('set null');
首先确保将外键字段设置为可为空:
$table->integer('foreign_id')->unsigned()->nullable();
答案 1 :(得分:4)
根据
http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
$ table-> onDelete('set null')应该可以正常运行
$table->...->onDelete(DB::raw('set null'));
如果有任何错误,也会有所帮助
答案 2 :(得分:4)
答案 3 :(得分:2)
在带有InnoDB的MySQL 5.5上使用Laravel 4.2,onDelete('set null')可以正常工作。
答案 4 :(得分:1)
在 Laravel 8 中你可以这样做。
$table->foreignId('table_id')->nullable()->constrained()->onDelete('set null');
nullable() 列修饰符必须在 constrained() 和 onDelete('set null') 之前调用
答案 5 :(得分:0)
答案 6 :(得分:0)
SQLite 不支持 ALTER TABLE 命令的 ADD CONSTRAINT 变体