Laravel 使用Eloquent删除包含文件的多个项目

Laravel 使用Eloquent删除包含文件的多个项目,laravel,Laravel,我有Ad,它有许多AdPhoto // Ad model public function ad_photos() { return $this->hasMany('App\AdPhoto')->orderBy('position', 'desc'); } // AdPhoto model public static function boot() { parent::boot(); AdPhoto::deleting(function($photo) {

我有
Ad
,它有许多
AdPhoto

// Ad model
public function ad_photos() {
  return $this->hasMany('App\AdPhoto')->orderBy('position', 'desc');
}
// AdPhoto model
public static function boot() {
  parent::boot();
  AdPhoto::deleting(function($photo) {      
    \File::delete(public_path('photos').'/'.$photo['filename']);    
  }
}
它可以直接删除AdPhoto(删除db记录和文件):

它不适用于删除广告(不删除文件,仅删除数据库记录):

如何让它工作


(Laravel 5.4)

您可以在
AdPhoto
模型中创建一个方法,并使用它而不是使用事件:

AdPhoto::deletePhotos($adId);
方法示例:

public static function deletePhotos($adId)
{
    $photos = this->where('ad_id', $adId)->get();
    foreach ($photos as $photo) {
        \File::delete(public_path('photos').'/'.$photo['filename']);
    }
    return $this->destroy($photos->pluck('id')->toArray());
}
尝试创建以侦听删除事件

因此,您的
AdPhoto
观察者将具有此函数来处理删除

public function deleting(\App\AdPhoto $photo)
{
    // remove from storage here
    \File::delete(public_path('photos').'/'.$photo->filename); 
}
解决方法如下:

foreach($ad->ad_photos()->get() as $photo) {
    $photo->delete();
}
public function deleting(\App\AdPhoto $photo)
{
    // remove from storage here
    \File::delete(public_path('photos').'/'.$photo->filename); 
}
foreach($ad->ad_photos()->get() as $photo) {
    $photo->delete();
}