024. 级联处理软删除关系——askedio/laravel-soft-cascade
级联处理软删除关系——askedio/laravel-soft-cascade
当某个模型被删除的时候,我们需要联动删除这个模型关联的其他模型,比如某个话题下面有很多条回复,当这个话题被删除了之后,需要将话题的回复数据删除,否则就变成了垃圾数据。
处理这样模型之间的联动删除一般有两种方法:
- 创建数据库外键索引;
例如可以给回复表增加外键$table->foreign('topic_id')->references('id')->on('topics')->onDelete('cascade');
这样话题删除后,对应的回复数据会同时删除。
- 通过逻辑控制,借助模型的事件,触发关联模型的删除。
两种方式都可以实现需求,外键的方式会更加的简单,但是外键会带来额外数据库的开销,当 Web 应用请求量大,数据库遇到瓶颈的时候,可能会去除外键,通过逻辑控制进行级联删除,因为 DB Server 成本要更高。
不过一旦模型使用了软删除,那么外键的方式就彻底不能用了,数据并没有真实的从数据库中删除,所以必须手动添加级联删除的逻辑。
场景分析
先来看一下 LaraBBS 现有的处理,话题数据删除的时...