3分钟短文:Laravel 检查记录是否被软删除

2020-09-10 14:50:35 浏览数 (1)

引言

laravel模型中引入了SoftDeletes这个全局作用域用于将数据库的条目 标记为删除,而实际上并不清除数据,这样可以为后续的数据恢复做铺垫。本文就来说一说,如何检验一个数据条目是否被软删除了。

学习时间

使用软删除功能,比较简单,只需要在模型中使用如下代码类:

代码语言:javascript复制
use IlluminateDatabaseEloquentSoftDeletes;

class User extends Model
{
    use SoftDeletes;
}

如果数据库表中正好是使用 deleted_at 标记删除日期时间,那么无需手动指定该字段为软删除字段了。如果是其他字段,需要手动指定。我们看框架源代码关于软删除部分,这里做了精简:

代码语言:javascript复制
protected function runSoftDelete()
{
    $this->{$this->getDeletedAtColumn()} = $time;
}

这里是指定软删除列为当前日期时间。接着看 getDeletedAtColumn 方法。这里没有精简,是原始内容:

代码语言:javascript复制
public function getDeletedAtColumn()
{
    return defined('static::DELETED_AT') ? static::DELETED_AT : 'deleted_at';
}

大家可以看到,如果定义了 DELETED_AT 常量,那么就用这个值,如果没有定义,就使用默认的 deleted_at。

那么好了,如果要自定义软删除字段,只用在继承类,也就是模型内编辑此常量即可:

代码语言:javascript复制
class User extends Model
{
    use SoftDeletes;
    const DELETED_AT = 'my_deleted_at';
}

如果要使用框架的格式化方法对该字段进行标准操作:

代码语言:javascript复制
protected $dates = ['my_deleted_at'];

检查条目

上一节介绍了默认的软删除使用方法,和自定义软删除字段的方法。使用了软删除功能后,会在模型的查询方法上,默认追加

代码语言:javascript复制
where deleted_at is null 

那么如果使用了全量查询后,如何判断一个记录是否是已经软删除的呢?laravel提供了这些功能。

代码语言:javascript复制
$users = User::withTrashed()->where('active', 1)->get();

然后使用遍历判断是否已软删除:

代码语言:javascript复制
foreach($user as $user)
{
    if ($user->trashed()) {
        continue;
    }
}

或者使用另一个函数判断:

代码语言:javascript复制
method_exists($user, 'trashed')

如果有 trashed 方法,则是删除的模型记录。

写在最后

本文通过对laravel模型中软删除的源码分析, 为大家展示了引入软删除功能,并自定义软删除标记字段的方法。通过模型提供的方法,进而判断记录是否已软删除。

0 人点赞