Laravel关系模型中的软删除

38

我需要获取一个模型关系,包括其软删除的元素,但仅针对此1个实例。我不想更改模型,使得每次使用关系时都返回所有软删除的记录。

我该如何实现这一点?

用户模型

class User extends Authenticatable
{
  public function contacts(){
    return $this->hasMany('App\Contacts','user_id','id');
  }
}

控制器

$user = User::findOrFail($id);
//Need to be able to get the trashed contacts too, but only for this instance and in this function
$user->contacts->withTrashed(); //Something like this
return $user;

我该如何在控制器内仅一次获取已删除的行?

谢谢


问题在于使用 $user->contacts 会返回用户联系人的相关记录集合,而 $user->contacts() 则会执行新的查询。 - Oluwatobi Samuel Omisakin
4个回答

81

你可以以不同的方式使用 withTrashed 方法。

要将调用与您的关系关联,可以按以下方式执行:

public function roles() {
    return $this->hasMany(Role::class)->withTrashed();
}

在飞行中使用相同的:

$user->roles()->withTrashed()->get();

针对你特殊的情况:

$user->contacts()->withTrashed()->get();

完全超出了我的理解范围,只是在视图本身中运行withTrashed()方法,而我正在循环遍历它。这可能是实现这一点最干净的方式,谢谢! - S_R
我如何在使用withTrashed()获取记录时过滤记录? - hassanrazadev

38

您还可以通过向with()方法添加子句来进行贪婪加载。

$user = User
   ::with(['contacts' => fn($q) => $q->withTrashed()])
   ->findOrFail($id);

例如,您还可以使用company.user来处理嵌套关系。 - Vahid Amiri

3

查看 Laravel 文档中关于查询软删除模型的内容:

//The withTrashed method may also be used on a relationship query: 
$flight->history()->withTrashed()->get(); 

问题在于使用$user->contacts会返回与用户相关的联系人记录集合,而$user->contacts()将创建一个新的查询。

1
你如何处理嵌套关系?A属于多个B,而B有多个C?我需要一种方法来表示“给我所有A的结果(包括已删除的),其中所有关系(B和B->C)都显示已删除的元素”。这可能吗? - Julian

0

你可以用以下方法实现:

$user = User::findOrFail($id);

$user->contacts()->withTrashed()->get(); //get all results

return $user;

当您使用()调用关系时,可以附加withTrashed()方法。之后您需要get()结果。

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