【问题标题】:Laravel eloquent with Trashed on relationshipLaravel 雄辩地与 Trashed 建立关系
【发布时间】:2019-01-10 07:01:09
【问题描述】:

我需要能够获得包括其软删除元素的模型关系,但仅限于这 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;

我怎样才能在我的控制器中只获得这 1 次被丢弃的行?

谢谢

【问题讨论】:

  • 问题是使用$user->contacts将联系人相关记录的集合返回给用户,而$user->contacts()会进行新的查询`

标签: php laravel laravel-5 eloquent


【解决方案1】:

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

要将呼叫与您的关系相关联,您可以执行以下操作:

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

在飞行中使用相同的:

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

针对您的特殊情况:

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

【讨论】:

  • 在我循环的视图本身中运行withTrashed() 方法完全不是我的想法。可能是实现这一目标的最干净的方法,谢谢!
  • 使用 withTrashed() 获取记录时如何过滤记录? laracasts.com/discuss/channels/laravel/…
【解决方案2】:

您也可以通过在 with() 方法中添加子句来预先加载它们

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

【讨论】:

    【解决方案3】:

    查看Querying soft deleted models 上的 Laravel 文档:

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

    问题是使用$user->contacts将联系人相关记录的集合返回给用户,而$user->contacts()会进行新的查询。

    【讨论】:

    • 如何处理嵌套关系? A 属于许多 B 和 B 有许多 C?我需要一种方式来说“给我 A(包括垃圾)的所有结果,其中所有关系(B 和 B->C)都显示垃圾元素”。这可能吗?
    【解决方案4】:

    你可以这样做:

    $user = User::findOrFail($id);
    
    $user->contacts()->withTrashed()->get(); //get all results
    
    return $user;
    

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

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 2017-05-19
      • 2021-05-24
      • 2017-10-12
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 2019-12-09
      • 2015-03-14
      相关资源
      最近更新 更多