【问题标题】:filter results based on model method基于模型方法过滤结果
【发布时间】:2015-09-07 06:57:20
【问题描述】:

我有这些模型,地点,评论,用户。 一个用户可以为多个场地评分。
一个venue 有很多reviews 一个review 属于一个venueuser

在我的场地模型上,我有一个计算场地分数的方法:

public function score()
{
    $reviewCount = $this->reviews()->count();
    $qualitySum = $this->reviews()->sum('quality') * 2;
    $decorSum = $this->reviews()->sum('decor');
    $venueAverage = ($qualitySum + $decorSum) / ($reviewCount * 30);
    $minReview = 5;
   //based on weighted average and Barnsley  average
    $average = ($reviewCount * Review::R()) / ($reviewCount + $minReview) + ($minReview * $venueAverage) / ($reviewCount + $minReview);
    $average = round($average, 1);
    return $average;
}

这里的问题是:我怎样才能检索那些得分为>3的场地
以及如何根据分数对结果进行排序

【问题讨论】:

    标签: laravel model laravel-5 eloquent


    【解决方案1】:

    查看http://laravel.com/docs/5.1/eloquent-relationships,他们使用以下示例:

    // Retrieve all posts with at least one comment containing words like foo%
    $posts = Post::whereHas('comments', function ($query) {
        $query->where('content', 'like', 'foo%');
    })->get();
    

    基于上述,您应该能够将约束放入您的“评论”中 whereHas 功能:

    $venues = Venue::whereHas('location', function ($query) use ($city) {
            $query->whereCityId($city->id);
        })
            ->whereHas('cuisines', function ($query) use ($cuisine) {
                $query->whereName($cuisine);
            })
            ->whereHas('reviews',function($query) use ($minCount)
            {
                $query->where('score', '>', 3);
            })
            ->take(3)->get();
    

    您还可以通过在 ->get() 之前或之后添加 ->count() 来获取计数,具体取决于您的用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      相关资源
      最近更新 更多