我想了解一些事情。
我有一个项目模型 一个项目可以有很多文件 文档有很多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保持为空。
如何通过所有相关模型进行软删除?
由于
答案 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();
}
}