编程语言
首页 > 编程语言> > php-Laravel 5.5自定义模型软删除

php-Laravel 5.5自定义模型软删除

作者:互联网

我的帖子通过状态列中的值定义为是否软删除,其中:0 =不可用,1 =可用,77 =软删除.

当前,我在模型中添加了一个全局范围,以确保不返回软删除的帖子:

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

    static::addGlobalScope('status', function (Builder $builder) {
        $builder->where('status', '!=', '77');
    });
}

如何使用默认的时间戳和delete_at列修改模型的softDelete(内置的Laravel功能)以使用基于数字/状态的系统,使其在使用-> delete(),- > withTrashed()和-> restore()?

解决方法:

您可以查看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()方法相同的功能.

标签:lumen,laravel,eloquent,models,php
来源: https://codeday.me/bug/20191110/2013751.html