尝试在事件中获取已删除的DB对象的ID

时间:2016-09-09 15:28:06

标签: php eloquent lumen

我正在使用Lumen构建API,我的应用程序的这个特定部分包含以下关系:

促销活动有很多项目 物品有很多图像

在图片上传中,插入一行,为所提供的图片提供URL。图像上传到public / assets / promotion_ $ id / item_ $ id。

删除某个项目时,其各自的图像文件夹也会被删除。那部分相对容易,可以在我的PromotionController里面完成:

public function delete_item(Request $request)
{
    $item = PromotionItems::find($request->input('id'))->toArray();
    $img_folder_path = 'assets/promotions/promotion_' . $item['promotion_id'] . '/item_' . $item['id'];

        if(is_dir($img_folder_path))
        {
            $files = array_diff(scandir($img_folder_path), array('.','..')); 
            foreach ($files as $file) 
            { 
              unlink($img_folder_path . '/' . $file); 
            } 
            rmdir($img_folder_path); 
        }

        $delete = PromotionItems::destroy($request->input('id'));
        return response()->json($delete);
}

这没关系,但是当删除促销时也需要这样做。现在,当删除促销时,会调用一个也删除项目的事件。删除项目时,将调用一个事件,该事件还会删除数据库中的图像行。所以它是一个很好的,整洁的事件链。

但是,如果直接删除项目,它只会删除图像文件夹,这就是为什么我想将此代码放入我的项目模型中的删除事件中:

protected static function boot() 
    {
        parent::boot();
        static::deleting(function($item) 
        {

            $item->images()->delete();
        });
    }

但是,此功能的范围似乎并未扩展到要删除的实际对象。由于图片路径包含ID,因此我需要在项目删除之前访问该项目的属性。

我对Laravel / Lumen / Eloquent比较新,所以任何建议都会受到赞赏。

编辑:我知道技术上可以将我的Promotion控制器中的文件夹删除代码放入其删除功能中,只需调用所有项目并循环浏览它们,删除所有文件夹/文件。但那是多余的代码,我想避免它。

1 个答案:

答案 0 :(得分:0)

我发现我无论如何都要在促销删除时删除文件夹,因为我想要删除它的顶级目录。所以我只是在我的控制器中做了一种递归函数:

public function remove_directory($path)
    {
        if(is_dir($path))
        {
            $files = array_diff(scandir($path), array('.','..')); 
            foreach ($files as $file) 
            { 
              (is_dir("$path/$file")) ? $this->remove_directory("$path/$file") : unlink($path . '/' . $file); 
            } 
            rmdir($path); 
        }
    }

因此,当我从delete_promotion函数调用它时,它会删除促销文件夹及其中的所有文件夹/文件。我只是调用相同的函数,但在delete_item函数的路径上使用/ item_ $ id。