以下循环有效:
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.
模型之间的关系已正确设置(有很多...等)
答案 0 :(得分:1)
编辑:我找到了! 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()
部分时,我偶然发现了Laravel 5.3 withCount() nested relation。似乎有可能,但是您必须将您的关系更改为hasManyThrough()
。它应该是一个不错的起点。