我可以在删除所述类别时将图像的 category_id 更改为 null 吗?

Posted

技术标签:

【中文标题】我可以在删除所述类别时将图像的 category_id 更改为 null 吗?【英文标题】:Can I change category_id of images to null on deletion of said category? 【发布时间】:2019-05-22 21:27:26 【问题描述】:

我有 2 张桌子 - imagescategoriesimages 表有一个名为 category_id 的列,它获取分配此图像的类别的 ID。我尝试将 category_id 设为一个外键,该外键将在级联时被删除,但没有成功,也许我没有正确执行。

    Schema::create('images', function (Blueprint $table) 
        $table->increments('id');
        $table->string('name');
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')
              ->references('id')
              ->on('users')
              ->onDelete('cascade');
        $table->integer('category_id')->nullable()->default(null)->unsigned();
        $table->foreign('category_id')
              ->references('id')
              ->on('categories')
              ->onDelete('cascade');
        $table->string('image_file_name');
        $table->timestamps();
        $table->engine = 'InnoDB';
    );

我收到的错误是:

SQLSTATE[HY000]:一般错误:1215 无法添加外键约束(SQL : 更改表images 添加约束images_category_id_foreign 外部 删除级联时的键 (category_id) 引用 categories (id)

解决迁移问题后,结果发现 ->onDelete('cascade') 不是我想要的。我只是想在删除图像时将 category_id 设置为 NULL,而不是删除图像。

【问题讨论】:

它是否抛出任何异常或它只是不工作? 哦,我收到了 SQLSTATE[HY000]: 一般错误:1215 无法添加外键约束(SQL : 更改表images 添加约束images_category_id_foreign 外键(category_id)引用categories (id) 删除级联) 您是否先创建了 categories 表? 好吧,我使用 php artisan migrate 所以我不确定创建表的顺序。我可以将其设置为先创建类别吗? 通常迁移文件名以日期开头,所以必须按照运行的顺序排序,所以只需检查文件的顺序 【参考方案1】:

迁移文件的顺序会影响外键,所以处理这种问题有两种方法:

按特定顺序创建表,因此必须在相关表之后创建外键。

为外键创建新迁移,但确保在两个表之后创建此迁移文件。


对于第二个问题: 调用onDelete('cascade'); 将删除与您删除的类别相关的所有图像。

现在如果你想将外键 category_id 设置为 null,只需将其替换为 ->onDelete('set null')

希望这会有所帮助。

【讨论】:

正是我需要的。谢谢。【参考方案2】:

此迁移没有任何错误我认为您应该检查类别表是否存在并且类别表中的 id 列是否为无符号整数(增量())。 我在我的系统上测试了这个迁移,它运行得非常好。

    Schema::create('categories', function (Blueprint $table) 
        $table->increments('id');
        $table->string('name');
        $table->timestamps();
        $table->engine = 'InnoDB';
    );

    Schema::create('images', function (Blueprint $table) 
        $table->increments('id');
        $table->string('name');
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
        $table->integer('category_id')->nullable()->default(null)->unsigned();
        $table->foreign('category_id')
            ->references('id')
            ->on('categories')
            ->onDelete('cascade');
        $table->string('image_file_name');
        $table->timestamps();
        $table->engine = 'InnoDB';
    );

【讨论】:

以上是关于我可以在删除所述类别时将图像的 category_id 更改为 null 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在删除类别之前更新相关帖子

谷歌表格自适应列表?

iOS开发之category(类别)

如何在magento 1.9中的cms主页滑块上显示类别?

完全删除所有类别

我不知道为什么类别显示在帖子下方