Laravel框架基于外键关系的级联删除的两种实现方法

例如一个论坛系统有帖子表topics和评论表replies。一个帖子可以有0条或多条评论。评论表replies有一个topic_id列,是指向帖子表topics的id列的外键。

当删除一个帖子时,应该级联删除其所有评论。有两种方法:

  • 方法一,在评论表replies的迁移文件中,定义外键约束时调用onDelete('cascade')方法表示删除应级联:
$table->foreignId('topic_id')
      ->constrained()
      ->onDelete('cascade');

让Laravel框架帮我们做基于外键关系的级联删除操作。参考官方文档外键约束。这种方法简单有效,缺点是不够灵活,有些开发规范不推荐使用外键约束。

  • 方法二, 在Eloquent模型的deleted事件的监听器中自己写代码实现级联删除,好处是灵活、扩展性强,不受底层数据库约束,坏处是要自己写很多代码,容易产生bug。

在实际开发中,方法二用得更多,因为更灵活、扩展性强。例如可以方便实现“不真正删除而是放入回收站表”这种功能。

参考

9.3. 防止数据损坏

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注