При удалении модели с признаком Mediable все ссылки на связанные носители автоматически удаляются из таблицы Mediables благодаря прослушивателю событий. Хорошо. Но это не удаляет связанные записи мультимедиа или файлы на диске, которые были с этими носителями. Я могу понять, что это отчасти по замыслу: эти записи СМИ также могут быть связаны с другими объектами.
Но в этом контексте элемент мультимедиа будет прикрепляться только к одному элементу за раз, и если элемент исчезает, элемент мультимедиа и связанные с ним файлы должны go с ним.
В настоящее время я решаю эту проблему, регистрируя прослушиватель delete () на модели и перебирая все подключенные носители, отсоединяя его, а затем удаляя его, один за другим.
Это рекомендуемый подход или я пропустил некоторые детали реализации в laravel -медиа, которые бы автоматически убирали эту уборку, когда количество ссылок на данный носитель исчерпано?
public static function boot()
{
parent::boot();
static::deleting(function (self $model) {
$mediabytag = $model->getAllMediaByTag();
if ($mediabytag) {
foreach ($mediabytag as $tag => $medias) {
foreach ($medias as $m) {
$model->detachMedia($m);
$m->delete();
}
}
}
});
}
Обновление: Насколько я понимаю, Mediable устанавливает отношения как полиморф c многие ко многим:
/**
* Relationship for all attached media.
* @return MorphToMany
*/
public function media(): MorphToMany
{
return $this
->morphToMany(
config('mediable.model'),
'mediable',
config('mediable.mediables_table', 'mediables')
)
->withPivot('tag', 'order')
->orderBy('order');
}