laravel遍历具有深厚关系的雄辩模型

时间:2019-04-22 17:12:54

标签: 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.

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

1 个答案:

答案 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()。它应该是一个不错的起点。