引言
laravel模型中引入了SoftDeletes这个全局作用域用于将数据库的条目 标记为删除,而实际上并不清除数据,这样可以为后续的数据恢复做铺垫。本文就来说一说,如何检验一个数据条目是否被软删除了。
学习时间
使用软删除功能,比较简单,只需要在模型中使用如下代码类:
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
如果数据库表中正好是使用 deleted_at 标记删除日期时间,那么无需手动指定该字段为软删除字段了。如果是其他字段,需要手动指定。我们看框架源代码关于软删除部分,这里做了精简:
protected function runSoftDelete()
{
$this->{$this->getDeletedAtColumn()} = $time;
}
这里是指定软删除列为当前日期时间。接着看 getDeletedAtColumn 方法。这里没有精简,是原始内容:
public function getDeletedAtColumn()
{
return defined('static::DELETED_AT') ? static::DELETED_AT : 'deleted_at';
}
大家可以看到,如果定义了 DELETED_AT 常量,那么就用这个值,如果没有定义,就使用默认的 deleted_at。
那么好了,如果要自定义软删除字段,只用在继承类,也就是模型内编辑此常量即可:
class User extends Model
{
use SoftDeletes;
const DELETED_AT = 'my_deleted_at';
}
如果要使用框架的格式化方法对该字段进行标准操作:
protected $dates = ['my_deleted_at'];
检查条目
上一节介绍了默认的软删除使用方法,和自定义软删除字段的方法。使用了软删除功能后,会在模型的查询方法上,默认追加
where deleted_at is null
那么如果使用了全量查询后,如何判断一个记录是否是已经软删除的呢?laravel提供了这些功能。
$users = User::withTrashed()->where('active', 1)->get();
然后使用遍历判断是否已软删除:
foreach($user as $user)
{
if ($user->trashed()) {
continue;
}
}
或者使用另一个函数判断:
method_exists($user, 'trashed')
如果有 trashed 方法,则是删除的模型记录。
写在最后
本文通过对laravel模型中软删除的源码分析, 为大家展示了引入软删除功能,并自定义软删除标记字段的方法。通过模型提供的方法,进而判断记录是否已软删除。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货