0

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

2 回答 2

2

您想使用模型事件而不是覆盖核心功能。引用文档:

Eloquent 模型触发多个事件,允许您使用以下方法连接到模型生命周期中的各个点:创建创建更新更新保存保存删除删除恢复恢复

你想要做的是与这些挂钩。您可以通过多种方式做到这一点(请参阅此处的文档)。下面是一个通过设置模型引导方法的例子:

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

然后,您可以在其他模型中执行相同操作。希望有帮助!

于 2014-08-14T18:16:02.220 回答
2

$this->versions()->delete();以及对查询构建器Version::whereIn('id', $ids)->delete();delete()调用,而不是雄辩的模型,这意味着模型事件不会被触发。相反,您应该这样做:

foreach($this->versions as $version) { $version->delete(); }

于 2014-08-15T13:57:23.090 回答