Laravel 10删除父模型后无法触发关联子模型软删除问题
问题解决:Laravel 10 软删除父模型时子关联的模型事件未触发
问题原因
当调用$planning->planningDetail()->delete()时,这是基于查询构造器的批量删除操作,只会直接执行数据库更新语句,不会触发PlanningDetail模型的deleted事件,因此关联的OrderRecord软删除逻辑无法被触发。只有对单个模型实例调用delete()方法时,才会触发模型的生命周期事件。
解决方案
方法1:遍历子模型实例逐个删除(保留模型事件触发)
修改Planning模型中的deleted回调逻辑,先获取所有关联的PlanningDetail实例,再逐个调用delete(),这样会触发每个PlanningDetail的deleted事件,进而自动软删对应的OrderRecord:
protected static function booted(): void { static::deleted(function ($planning) { // 使用属性获取模型集合,而非查询构造器 $planning->planningDetail->each(function ($detail) { $detail->delete(); }); }); }
方法2:直接级联删除关联记录(高效但跳过子模型事件)
如果PlanningDetail的deleted事件没有其他额外逻辑,也可以直接在Planning的删除事件中批量删除OrderRecord和PlanningDetail,这种方式执行效率更高:
use App\Models\OrderRecord; protected static function booted(): void { static::deleted(function ($planning) { // 先批量删除关联的OrderRecord OrderRecord::whereIn('planning_detail_id', $planning->planningDetail->pluck('id'))->delete(); // 再批量删除PlanningDetail $planning->planningDetail()->delete(); }); }
验证说明
- 方法1会完整触发
PlanningDetail的所有模型生命周期事件,适合需要在PlanningDetail删除时执行其他逻辑的场景。 - 方法2直接操作数据库,性能更优,但会跳过
PlanningDetail的模型事件,仅适用于单纯软删关联数据的场景。
内容的提问来源于stack exchange,提问作者Josh Lee
相关产品推荐
相关产品推荐

