【发布时间】:2014-05-07 12:53:31
【问题描述】:
我正在使用 Laravel 4.1 并正在尝试级联删除。我这样做是因为一些删除方法会删除存储在 S3 上的关联资产,因此依赖 DB 级联删除是不合适的。
假设我有一个 Entry 模型,它本身有一个图像和许多相关的 Option,它们也有如下所示的图像(为了简洁而减少)。
class Entry extends Eloquent {
public function image()
{
return $this->morphOne('Image', 'imageable');
}
public function options()
{
return $this->hasMany('Option');
}
protected static function boot() {
parent::boot();
static::deleting(function($entry) {
$image = $entry->image;
if($image !== null) {
$image->delete();
}
$entry->options()->delete()
//Option::where('entry_id', $entry->id)->delete(); This also doesn't work
});
}
}
class Option extends Eloquent {
public function entry()
{
return $this->belongsTo('Entry');
}
public function image()
{
return $this->morphOne('Image', 'imageable');
}
protected static function boot() {
parent::boot();
static::deleting(function($option) {
Log::info('Trying to delete an option object');
$image = $option->image;
if($image !== null) {
$image->delete();
}
});
}
}
注意:我正在按照this answer 中的建议进行删除。
当我调用 $entry->delete() 时,它将删除图像和条目本身,但是永远不会在选项上调用删除处理程序(我没有看到它输出到日志)。但是,如果我在条目删除功能中使用以下内容,一切正常。
foreach($entry->options as $option) {
$option->delete();
}
为什么 $entry->options()->delete() 不起作用?这是 Laravel 中的错误还是我犯了一个错误。
【问题讨论】: