如何在删除时处理 MySql + Laravel 中的外键约束?

Posted

技术标签:

【中文标题】如何在删除时处理 MySql + Laravel 中的外键约束?【英文标题】:How can I deal with foreign key constraints in MySql + Laravel on delete? 【发布时间】:2022-01-02 01:55:44 【问题描述】:

我有一个看起来像这样的 slots 表。过于简化,但有助于演示:

Date Service_id
2021-11-03 1
2021-11-04 2

基本上,用户选择一个日期和他想要的服务。这是一个预订系统。从上面的 service_id 到 services 表的 id 还有一个外键关系。

id name
1 Haircut
2 Manicure
3 Massage

我的槽表迁移包含以下内容:

Schema::table('slots', function (Blueprint $table) 
     $table->foreignId('service_id')->nullable()->constrained();
);

我现在想做的是能够删除服务,而不会从槽表中的现有记录中抛出任何错误。

【问题讨论】:

【参考方案1】:

你可以$table->nullOnDelete(); 但是这样槽表中的Service_id 列应该可以为空:

Schema::table('slots', function (Blueprint $table) 
     $table->foreignId('service_id')->nullable()->constrained()->nullOnDelete();
);

这样,slots 中对应的行在Service_id 列中会为空。

另一种方式是使用->cascadeOnDelete(),这样当你删除一个服务时,所有相关的slot都会被删除:

 Schema::table('slots', function (Blueprint $table) 
         $table->foreignId('service_id')->nullable()->constrained()->cascadeOnDelete();
);

【讨论】:

以上是关于如何在删除时处理 MySql + Laravel 中的外键约束?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel框架Mysql连接多库时事物处理需要指定库

laravel如何使用软删除

如何使用 Laravel 和 MySQL 获取大量记录?

在 Laravel 中使用 MySQL 数据库连接运行多个单元测试时出错

如何在 laravel 5 中删除帖子资源?

在 laravel 中更新时如何删除公共/文件夹中的多个图像?