引言
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模型中软删除的源码分析, 为大家展示了引入软删除功能,并自定义软删除标记字段的方法。通过模型提供的方法,进而判断记录是否已软删除。