今天犯了一个低级错误,在 Laravel 关联模型删除时,无法触发关联模型的删除事件,示例代码如下:

SelfExam Model:

class SelfExam extends Model
{
    protected $table = 'self_exam';

    /**
     * 获取自考本科业务项目对应的基础项目
     */
    public function project(): MorphOne
    {
        return $this->morphOne(Project::class, 'projectable');
    }

    protected static function booted()
    {
        static::deleting(function ($model) {
            //$model->project()->delete();
            $model->project->delete();
        });
    }
}

Project Model:

class Project extends Model
{
	use HasDateTimeFormatter;

    /**
     * 获取拥有此项目的模型(不同的业务类型)
     */
    public function projectable(): MorphTo
    {
        return $this->morphTo();
    }

    /**
     * 获取此项目对应的订单
     */
    public function orders(): BelongsToMany
    {
        return $this->belongsToMany(Order::class)->withPivot('amount', 'price');
    }


    protected static function booted()
    {
        static::deleting(function ($model) {
            $orders = $model->orders()->whereNotNull('paid_at')->get();
            if(!$orders->isEmpty())
            {
                throw new Exception('该项目已存在有效的报名订单,无法删除只能关闭!');
            }
        });
    }
}

SelfExam 和 Project 是多态一对多的关联。我想通过模型事件实现,在删除 SelfExam 时,关联删除对应的 Project ,如果 Project 已经有支付成功的订单了,那么提示无法删除只能关闭。

但是我第一次写的代码是:

$model->project()->delete();

这样并没有真正加载模型,它只是创建了数据库查询,然后在添加部件时变成删除查询->delete(),正确的做法是:

$model->project->delete();

这样才回触发关联事件,虽然只差了一组小括号但是实际意义却相差很大。