2015-03-23 2 views
0

У меня есть две таблицы: категории и продукты.Laravel 5 удаление изображения продукта при удалении всей категории

В миграции продуктов таблицы я определил это:

$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); 

так, когда категория удаляется, все продукты из этой категории будут удалены.

Модели категории содержит:

public function product() { 
    return $this->hasMany('App\Product'); 
} 

Модели продукта содержит:

public function category() { 
    return $this->belongsTo('App\Category'); 
} 

Категория и продукт модель содержит два метода для сохранения и удаления фотографий, которые хранятся в файловой системе.

метод для удаления фото, прикрепленное к категории или фотографиям:

public static function deleteImage($id) { 
    File::deleteDirectory(public_path() . self::$imagesPath . $id); 
} 

Этот метод вызывается перекрывая уничтожить функцию продукта или категории модели:

public static function destroy($id) { 
    self::deleteImage($id); 
    parent::destroy($id); 
} 

Таким образом, проблема в том, если я удалите категорию, я хочу также удалить изображения продуктов, кроме записей в таблице продуктов, но изображения продуктов остаются в файловой системе. Из файловой системы удаляются только изображения категорий.

Я поместил dd ('message') в функцию destroy в модели продукта, но кажется, что метод destroy на модели продукта не вызывается, когда категория удаляется.

Как удалить изображения продукта, когда категория удалена?

+1

продуктов удаление будет сделаны с тузда стороны (в случае InnoDB), не Laravel, так что вам нужно, чтобы запустить событие, перед удалите категории, чтобы перебрать все продукты, относящиеся к категориям, и удалить их. –

ответ

1

Поскольку MySQL удаляет продукты, Eloquent не имеет возможности узнать об этом.

Вы должны будете сделать это в deleting случае модели категории в:

class Category extends Eloquent { 

    public static function boot() 
    { 
     static::deleting(function() 
     { 
      foreach ($this->products as $product) 
      { 
       $product->deleteImage($product->id); 
      } 
     }); 
    } 

} 
Смежные вопросы