Php Laravel模式删除集null

Php Laravel模式删除集null,php,laravel,laravel-migrations,Php,Laravel,Laravel Migrations,无法确定如何在Laravel中对表设置正确的onDelete约束。(我正在与SqLite合作) 我有3次迁移,创建库表: Schema::create('galleries', function($table) { $table->increments('id'); $table->string('name')->unique(); $table->text('path')->unique(); $table->text('de

无法确定如何在Laravel中对表设置正确的onDelete约束。(我正在与SqLite合作)

我有3次迁移,创建库表:

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
});
我没有收到任何错误。此外,即使是“级联”选项也不起作用(仅在gallery表上)。删除图库将删除所有图片。但是删除封面图片不会删除图库(用于测试目的)

因为即使“级联”也没有被触发,所以我“设置null”不是问题所在

编辑(解决方法):

读完这篇文章后,我稍微改变了我的模式。现在,pictures表包含一个“is_cover”单元格,用于指示此图片是否为相册上的封面

对于原始问题的解决方案仍高度赞赏

根据

$table->onDelete('SETNULL')应该可以工作,请重试

$table->...->onDelete(DB::raw('set null'));
如果有任何错误,也会有帮助
  • 这是拉维尔的一个已知问题。更多信息

  • SQLite不支持此功能,请参阅

  • 也是一个有详细的问题摊牌


  • 在MySQL 5.5和InnoDB上使用Laravel 4.2,onDelete(“设置null”)可以工作。

    如果要在删除时设置null:

    $table->...->onDelete('set null');
    
    首先确保将外键字段设置为可空:

    $table->integer('foreign_id')->unsigned()->nullable();
    
    在laravel 8中,您可以使用:
    在laravel 8中,您可以这样做

     $table->foreignId('table_id')->nullable()->constrained()->onDelete('set null');
    

    必须在constrated()之前调用null()列修饰符,并且onDelete('set null')

    SQLite不支持ALTER TABLE命令的ADD CONSTRAINT变量


    您可能希望回滚,手动写出sql,然后在本地执行并运行测试。我所能找到的一切都表明应该有效,这可能是生成SQLThank的一个问题!不幸的是,它导致了同样的问题。我认为这是特定于SqLite和循环引用的内容。另外一个原因是onDelete('set null')与mysql一起工作。@SimonBengtsson该问题必须已被关闭或删除。另外对于
    ->nullable()
    是否有相关的Laravel文档?它没有记录有哪些选项,但我认为您可以假设它是默认的mysql值(请参见
    。/vendor/laravel/framework/src/illighte/Database/Schema/Grammars/Grammar.php
    $table->foreignId('forign_id')->nullable()->constrained("table_name")->cascadeOnUpdate()->nullOnDelete();
    
     $table->foreignId('table_id')->nullable()->constrained()->onDelete('set null');