【问题标题】:Laravel higher order message unexpected resultLaravel 高阶消息意外结果
【发布时间】:2020-02-12 01:06:15
【问题描述】:

我在 laravel 中有一个 higher order message。看起来像 这个:

$category->scores->each->ratings->where('result.rating', '>=', 3)->count();

categoryscoresscoreratingsratingresult

我想获得每个类别where >= 3的总评分。

使用我现在拥有的代码,最终结果始终为 0。

但是当我这样循环时:

@foreach($categories as $category)
    @foreach($category->scores as $score)
        @foreach($score->ratings->where('result.rating', '>=', 3) as $rating)
            {{ $rating->result->result_nl }}
        @endforeach
    @endforeach
@endforeach

有 3 个评分结果。

我的高阶消息有什么问题?

【问题讨论】:

  • each 代理实际上返回了分数集合(您可以从HigherOrderCollectionProxy 中的实现中了解原因)。这就是为什么链的其余部分不能按预期工作的原因,因为$category->scores->each->ratings 返回$category->scores 集合,并且对该集合应用where 条件很可能总是返回0。所以基本上整个表达式等于$category->scores->where('result.rating', '>=', 3)->count();

标签: php laravel laravel-6 laravel-collection


【解决方案1】:

您的问题中存在一些对高阶函数的误解。在文档和Laravel 实现中,他们使用方法调用。

在这里,您尝试在每次调用时执行 sum,每个都不会返回任何内容,而是使用 Collection 方法来替代 foreach

如果将以下函数添加到评分模型中。

public function ratingsOverTree()
{
    return $this->ratings->where('result.rating', '>=', 3)->count();
}

您可以使用sum 方法将结果相加,使用ratingsOverTree() 方法。

$category->scores->sum->ratingsOverTree();

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多