我使用L5.3.31并拥有以下型号:
附加组件
图像
关系:
// Addon.php
public function images()
{
return $this->hasMany('App\Image');
}
// Image.php
public function addon()
{
return $this->belongsTo('App\Addon');
}
我现在想要扩展delete()
方法,删除删除图像对象时保存在文件系统上的一些图像。据我所知,为了做到这一点,我需要在Image模型上扩展delete()
方法。现在,在我的图像模型上,如果我尝试这样做:
public function delete()
{
dd('triggered');
parent::delete();
}
我希望它会死掉并转储triggered
。但没有任何反应,对象会像以前一样被删除。这告诉我上面的代码块在删除时没有被执行,对吧?
我也在Addon模型上做了同样的事情,结果相同。最后,当我这样做时,我想要完成的是
$addon->images()->delete();
我希望laravel删除代表每个图像对象的文件。另外如果我$addon->images()->where('id', '=', $id)->delete();
我想删除对象旁边的给定id的图像文件。
顺便说一句,我不知道这是否重要,但是我已经将关系设置为级联删除,所以如果我$addon->where('id', '=', $id)->delete();
它也会删除其相关的图像对象。
答案 0 :(得分:6)
之间存在差异
$addon->images()->where('id', '=', $id)->delete();
和
$addon->images()->find(11)->delete();
第一个是查询构建器级别(这不会触发模型上的删除/删除事件)。
第二个是模型级别(这会触发模型上的删除/删除事件)。 查看有关Laravel 5.4
中事件的文档https://laravel.com/docs/5.4/eloquent#events
您可以添加观察者以捕获删除事件并执行您想要的操作 并且在Laravel关于同样的事情打开和关闭了一个问题 https://github.com/laravel/framework/issues/2536