与laravel 4级联的软删除无法按预期工作

时间:2014-08-14 17:03:57

标签: php laravel-4 eloquent soft-delete

我试图通过覆盖每个模型的delete()函数来进行级联软删除工作,我认为这应该从Project级联到VersionLink,但是问题是它似乎根本没有这样做。想法是删除项目也会删除所有版本,这将删除所有链接并清除其缓存版本,但使用$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();
  }
}

2 个答案:

答案 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(); }