例如一个论坛系统有帖子表topics和评论表replies。一个帖子可以有0条或多条评论。评论表replies有一个topic_id列,是指向帖子表topics的id列的外键。
当删除一个帖子时,应该级联删除其所有评论。有两种方法:
- 方法一,在评论表replies的迁移文件中,定义外键约束时调用
onDelete('cascade')
方法表示删除应级联:
$table->foreignId('topic_id')
->constrained()
->onDelete('cascade');
让Laravel框架帮我们做基于外键关系的级联删除操作。参考官方文档外键约束。这种方法简单有效,缺点是不够灵活,有些开发规范不推荐使用外键约束。
- 方法二, 在Eloquent模型的deleted事件的监听器中自己写代码实现级联删除,好处是灵活、扩展性强,不受底层数据库约束,坏处是要自己写很多代码,容易产生bug。
在实际开发中,方法二用得更多,因为更灵活、扩展性强。例如可以方便实现“不真正删除而是放入回收站表”这种功能。
参考