You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:05:55