Laravel 5:在模型上扩展delete()

时间:2017-04-24 15:43:36

标签: laravel model eloquent

我使用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();它也会删除其相关的图像对象。

1 个答案:

答案 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