当我使用预先加载查询时如何使用withTrashed?

Ric*_*haw 23 laravel

我有一些表,其中一个表是一个名为Users软删除行的表.

我的代码如下:

$appointments = Appointment::with('user')->get();

$return = array();
foreach ($appointments as $key => $appointment) {
    $return[] = array(
        $appointment->customer_name,
        $appointment->date->format('d/m/Y'),
        $appointment->time,
        $appointment->status,
        $appointment->user->full_name,
    );
}
Run Code Online (Sandbox Code Playgroud)

因为删除了用户的行,所以我在行上收到错误:

$appointment->user->full_name
Run Code Online (Sandbox Code Playgroud)

因为当然没有这个用户的匹配.

我尝试在第一行添加withTrashed(),无论是之前还是之后,with('user')但这没有用.

如何确保此查询确实返回所有用户的所有约会,甚至是已删除的约会?

Ton*_*rra 67

我不是百分之百确定这是有效的,因为这个方法是为了为加载加载添加约束,但你可能想尝试一下:

$appointments = Appointment::with(array('user' => function($query) {
    $query->withTrashed();
}))->get();
Run Code Online (Sandbox Code Playgroud)

这应该将withTrashed()应用于抓取用户的查询,而不是抓取约会的查询.

哦,只是为了澄清,你可以在两个查询中添加withTrashed():

$appointments = Appointment::with(array('user' => function($query) {
    $query->withTrashed();
}))->withTrashed()->get();
Run Code Online (Sandbox Code Playgroud)

编辑:只想到一个更简单的方法:

将withTrashed()添加到user()关系中(如果您希望在每次调用此关系时都应用此选项,请执行此操作):

public function user() {
  return $this->hasOne('User')->withTrashed();
}
Run Code Online (Sandbox Code Playgroud)

  • 对于最后一个解决方案:我会为它创建一个单独的方法,称为`trashedUser()`,所以你仍然可以使用原始方法. (9认同)