Laravel 使用 morphMany 关联删除无法执行模型事件
cases删除记录后,cases_media和attachment都删除对应的关联记录,可是attachment的模型事件无法执行。
Cases::find(id)->delete();
模型Cases
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
class Cases extends Model
{
protected $table = 'cases';
protected $guarded = [];
protected $primaryKey = 'id';
protected $casts
= [
'public' => 'boolean'
];
public static function boot()
{
parent::boot();
static::deleted(function ($cases) {
$cases->medias()->delete();
$cases->attachments()->delete();
});
}
/**
* 媒体资源
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function medias()
{
return $this->hasMany('App\Models\CasesMedia')->orderBy('id', 'desc');
}
/**
* 附件表信息
* @return \Illuminate\Database\Eloquent\Relations\MorphMany
*/
public function attachments()
{
return $this->morphMany('App\Models\Attachment', 'model');
}
}
附件模型Attachment
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
class Attachment extends Model
{
protected $table = 'attachments';
protected $guarded = [];
public static function boot()
{
parent::boot();
// 删除文件
static::deleting(function ($attachment) {
// 这里无法执行
Storage::disk($attachment->disk)->delete($attachment->file_path);
Log::info($attachment->file_path);
});
}
/**
* 关联模型
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
*/
public function model()
{
return $this->morphTo();
}
}
@xiaogui
性能要求不高的情况下,就是循环单个删除,可以触发模型的删除事件,
$cases->medias->each->delete()