如何在Eloquent中检查行是否被软删除?

74

在Laravel 5.1中,是否有一种方便的方法来检查一个Eloquent模型对象是否已经被软删除?我不是在谈论选择数据,而是在拥有对象之后,例如Thing::withTrashed()->find($id)

到目前为止,我唯一能想到的方法是:

if ($thing->deleted_at !== null) { ... }

我没有看到任何相关的方法在API中,例如允许

if ($thing->isDeleted()) { ... }
5个回答

127

刚刚意识到我在查错的API错误了。Model类中没有这个功能,但是我的模型使用的SoftDelete trait有一个trashed()方法。

因此我可以写成:

if ($thing->trashed()) { ... }

也许5.2版本不同,但我尝试过这个方法,它没有起作用。相反,当我尝试获取已被软删除的$thing时,Laravel返回了null,所以我只是检查了if ($thing == null) - Zachary Weixelbaum
1
@ZacharyWeixelbaum 你是否像我在问题中提到的那样使用了 withTrashed() 来获取项目?否则,你将无法获取任何已删除的记录。 - DisgruntledGoat

8
在Laravel6中,您可以使用以下功能。
检查Eloquent模型是否使用软删除:
if( method_exists($thing, 'trashed') ) {
    // do something
}

在使用资源响应时,检查Eloquent模型是否使用软删除:

if( method_exists($this->resource, 'trashed') ) {
    // do something
}

最后,检查模型是否被删除:
if ($thing->trashed()) {
    // do something
}

希望这能对您有所帮助!


6

对于那些在Laravel测试用例中寻求有关测试环境的答案的人,您可以进行如下断言:

$this->assertSoftDeleted($user);

或者在它被彻底删除时(没有软删除)

$this->assertDeleted($user);

2

这是最好的方法

$model = 'App\\Models\\ModelName';

$uses_soft_delete = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($model));

if($usesSoftDeletes) {
    // write code...
}

0

这对我有用

$checkDomain = Domain::where('tenant_id', $subdomain)->withTrashed()->first();
                
 if($checkDomain->trashed()){
       return redirect()->route('domain.not.found');
 }else{
     return view('frontend.' . theme() . '.index');
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接