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();
}