今天犯了一个低级错误,在 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();
这样才回触发关联事件,虽然只差了一组小括号但是实际意义却相差很大。