我的帖子被定义为软删除或不通过status
列中的值,其中:0 =不可用,1 =可用,77 =软删除。
目前,我在模型中添加了一个全局范围,以确保我不会返回软删除的帖子:
protected static function boot()
{
parent::boot();
static::addGlobalScope('status', function (Builder $builder) {
$builder->where('status', '!=', '77');
});
}
如何修改模型的softDelete
(laravels内置功能),从默认的timestamps和deleted_at列中使用我的基于数字/状态的系统,甚至/尤其是在使用{等方法时{1}},->delete()
和->withTrashed()
?
答案 0 :(得分:2)
您可以查看Laravel的模型事件部分。在您的模型中,扩展您创建的baseModel类。在此baseModel中,您可以添加在模型删除时触发的事件。像这样:
protected static function boot(){
static::deleting(function($thisModel){
$thisModel->attributes['status'] = 77;
$thisModel->save();
return false;
});
}
如果返回false,则停止删除模型的默认操作。因此,这将把状态设置为77而不是删除它。或者您可以在任何想要使用此类删除的模型中使用它,而不是使用基本模型。我发现基础模型对于具有一些可以实现基于状态的软删除的东西的大型项目更容易。
要扩展为此模型添加其他类似软删除功能,请考虑使用本地范围而不是列出的全局范围。例如:
public function scopeOnlyTrashed(Builder $query){
return $query->where('status', 77);
}
现在进行数据库调用时
Posts::onlyTrashed()->get();
您将获得与laravel的onlyTrashed()方法相同的功能。
答案 1 :(得分:1)
您需要插入模型用法类:
use Illuminate\Database\Eloquent\SoftDeletes;
同样在课堂宣言中你需要插入:
use SoftDeletes;
答案 2 :(得分:0)
您可以在存储库中定义一个方法,如下所示:
class YourRepository extends BaseRepository {
public function withTrashed() {
$this->model = $this->model->withTrashed();
return $this;
}
}
之后,您可以在控制器中链接相同的内容:
$records = $this->repository->withTrashed()->all();