【问题标题】:Laravel 5 deleting product image when entire category is deletedLaravel 5在删除整个类别时删除产品图片
【发布时间】:2015-05-26 14:00:51
【问题描述】:

我有两个表:类别和产品。

在产品表迁移中我定义了这个:

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

通过覆盖产品或类别模型上的destroy函数调用此方法:

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

所以,问题是如果我删除一个类别,我也想删除产品图像,除了产品表中的记录,但产品图像仍保留在文件系统中。仅从文件系统中删除类别图像。

我在产品模型的destroy函数中放了一个dd('message'),但似乎在删除类别时不会调用产品模型上的destroy方法。

删除类别后如何删除产品图片?

【问题讨论】:

  • 产品删除将从 mysql 端完成(在 innodb 的情况下),而不是 laravel,因此您需要在删除类别之前运行一个事件以遍历与该类别相关的所有产品并删除它们。

标签: php laravel relationship


【解决方案1】:

由于MySQL是删除产品的,Eloquent无从得知。

您必须在类别模型的deleting 事件中执行此操作:

class Category extends Eloquent {

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

}

【讨论】:

    猜你喜欢
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2018-02-22
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多