Laravel:如何根据访问者过滤模型

时间:2018-01-14 13:13:31

标签: php laravel laravel-5 eloquent

在我的产品型号中,我定义了一个访问器,它返回产品的平均评级。

访问者看起来像这样:

public function getAverageRatingAttribute(){
    if($this->reviews->count()){
        $count = 0;
        $rating = 0;
        foreach ($this->reviews as $review) {
           if($review->average_rating){
                $rating += $review->average_rating;
                $count++;
           }
        }
        return $rating/$count;
    }
    return 0;
}

现在,在我的控制器中,我想根据average_rating属性过滤结果。像这样:

$products->where('average_rating', '>=', $rating);

发生以下错误。

Column not found: 1054 Unknown column 'average_rating' in 'where clause' 

实现这一目标的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你不应该为此创建一个访问者。您还可以创建两个查询并将所有评论加载到内存中,以计算平均评分。

请改用avg()方法。

$average = Review::avg('average_rating');
$products = Product::whereHas('reviews', function($q) use($average) {
        $q->where('average_rating', '>=', $average);
    })->get();