我试图通过覆盖每个模型的delete()
函数来进行级联软删除工作,我认为这应该从Project
级联到Version
到Link
,但是问题是它似乎根本没有这样做。想法是删除项目也会删除所有版本,这将删除所有链接并清除其缓存版本,但使用$this->versions()->delete();
似乎并没有实际调用delete()
方法Version
模型。
关于如何使其按预期工作的任何想法?
class Project extends Eloquent {
protected $softDelete = true;
public function versions()
{
return $this->hasMany('Version');
}
public function delete()
{
$this->versions()->delete();
return parent::delete();
}
}
class Version extends Eloquent {
protected $softDelete = true;
public function project()
{
return $this->belongsTo('Project', 'project_id');
}
public function links()
{
return $this->hasMany('Link');
}
public function delete()
{
$this->links()->delete();
return parent::delete();
}
}
class Link extends Eloquent {
protected $softDelete = true;
public function version()
{
return $this->belongsTo('Version', 'version_id');
}
public function delete()
{
Cache::forget($this->id);
return parent::delete();
}
}
答案 0 :(得分:2)
您想使用models events而不是覆盖核心功能。引用文档:
Eloquent模型可以触发多个事件,允许您使用以下方法连接模型生命周期中的各个点:创建,创建,更新,更新,保存,保存,删除,已删除 ,恢复,恢复。
你想要做的就是勾起这些。您可以通过几种方式完成此操作(see the docs here)。以下是设置模型引导方法的示例:
public static function boot()
{
parent::boot();
/**
* Deleting
* - Called before delete()
* - Passes the instance in as param
*/
static::deleting(function($project){
// Get the project versions ids as an array
$ids = $project->versions()->lists('id');
// Delete the versions
Version::whereIn('id', $ids)->delete();
});
}
然后,您可以在其他模型中执行相同的操作。希望有所帮助!
答案 1 :(得分:2)
$this->versions()->delete();
以及Version::whereIn('id', $ids)->delete();
会对查询构建器执行delete()
调用,而不会使用雄辩的模型,这意味着模型事件不会被触发。相反,你应该这样做:
foreach($this->versions as $version) { $version->delete(); }