通过关系软删除

时间:2016-05-17 09:31:08

标签: laravel laravel-5

我想了解一些事情。

我有一个项目模型 一个项目可以有很多文件 文档有很多DocumentData。

所以这是直截了当的,我的模型设置如此

class Project extends Model
{
    protected $table = 'projects';
    protected $guarded = [];
    use SoftDeletes;

    public function document()
    {
        return $this->hasMany('App\document', 'projectId');
    }

    public static function boot()
    {
        parent::boot();

        static::deleted(function($document)
        {
            $document->delete();
        });
    }
}

class Document extends Model
{
    use SoftDeletes;

    protected $table = 'document';
    protected $guarded = [];

    public function project()
    {
        return $this->belongsTo('App\Project', 'projectId');
    }

    public function documentData()
    {
        return $this->hasMany('App\DocumentData', 'documentId');
    }

    public static function boot()
    {
        parent::boot();

        static::deleted(function($document)
        {
            $document->documentData()->delete();
        });
    }
}

class DocumentData extends Model
{
    use SoftDeletes;

    protected $table = 'document_data';
    protected $guarded = [];

    public function document()
    {
        return $this->belongsTo('App\Document', 'documentId');
    }
}

我正在尝试了解启动功能以及我是否已将其正确设置?删除项目时,会设置其deleted_at时间戳。我也在寻找它为所有Projects Documents和DocumentData设置时间戳的删除。

目前,当我删除项目时,设置了deleted_at时间戳。 Document和DocumentData保持为空。

如何通过所有相关模型进行软删除?

由于

1 个答案:

答案 0 :(得分:1)

您正确使用boot方法。我唯一注意到的是Project已删除事件的处理程序中的错误。您尝试在删除实例后再次删除该实例。相反,我想,您想要删除关联的Documents,如此:

public static function boot()
{
    parent::boot();

    static::deleted(function($project)
    {
        $project->document()->delete();
    });
}

替代方法:

我通常删除子项的方法是覆盖父模型上的delete()方法。我更喜欢这样的结果代码,但这只是个人偏好。

在你的情况下:

class Project extends Model {
    public function delete()
    {
        parent::delete();  // first delete the Project instance itself
        $this->document()->delete();  // delete children
    }
}

class Document extends Model {
    public function delete()
    {
        parent::delete();
        $this->documentData()->delete();
    }
}