拉拉维尔在具有深厚关系的雄辩模型中循环

  • 本文关键字:模型 循环 关系 laravel
  • 更新时间 :
  • 英文 :


下面的循环工作:

foreach($this->friends as $friend)
{
foreach($friend->mailings as $mailing)
{
foreach($mailing->orders as $order)
{
$num_orders++;
}
}
}

但想做

foreach($this->friends->mailings->orders as $order)
{
$num_orders++;
}

但是当我这样做时,我收到此错误Property [mailings] does not exist on this collection instance.

模型之间的关系设置正确(有许多...等)

编辑:我找到了!Jarek是Eloquent的伟大作家,我想看看他是否有这方面的技巧。他一如既往地这样做。:)

$this->load(['friends.mailings.orders' => function($q) use(&$orders){
$orders = $q->get();
}]);

现在,如果您dd($orders),您将获得与$this相关的朋友邮件的所有订单的列表,因此您现在可以对此进行搜索以获得所需的内容。

foreach($orders as $order){
$num_orders++
}

他的网站有一个证书警告,但这是我得到上述内容的地方。 https://softonsofa.com/laravel-querying-any-level-far-relations-with-simple-trick/

请忽略以下内容,因为它不再需要,但为了清楚起见,我将其保留在这里,因为它已被接受为答案。

可以使用each()收集方法来清理循环。由于存在多对多关系,因此无法访问相关模型关系,除非您循环访问它们或指定所需的相关项。见下文:

$this->friends->each(function($friend, $key){
$friend->each(function($mailing, $key2){
$mailing->orders->each(function($orders, $key3){
$num_orders++;
})  
});
})

https://laravel.com/docs/5.8/collections#method-each

还有您可能想要研究的withCount()查询生成器方法。它似乎不喜欢使用常规点符号的嵌套关系,但我还没有使用它来说明是否可以在这里使用它。我在研究withCount()部分时偶然发现了带有 Count() 嵌套关系的 Laravel 5.3。似乎有可能,但您将不得不将您的关系更改为hasManyThrough().这应该是一个很好的起点。

最新更新