基于模型法的过滤结果 [英] filter results based on model method

查看:137
本文介绍了基于模型法的过滤结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这些模型,场地,评论,用户。
a用户可以评分几个场地。

A 场地有很多评论
A 评论属于场地用户



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

  public function score()
{
$ reviewCount = $ this-> reviews() - > count();
$ qualitySum = $ this-> reviews() - > sum('quality')* 2;
$ decorSum = $ this-> reviews() - > sum('decor');
$ placesAverage =($ qualitySum + $ decorSum)/($ reviewCount * 30);
$ minReview = 5;
//基于加权平均值和Barnsley平均值
$ average =($ reviewCount * Review :: R())/($ reviewCount + $ minReview)+($ minReview * $ placesAverage)/($ reviewCount + $ minReview);
$ average = round($ average,1);
返回$ average;
}

这是一个问题:如何检索那些得分> 3的场地

我如何按照分数排序结果

解决方案

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

  //检索包含至少一个含有foo%
$ posts = Post :: whereHas('comments', function($ query){
$ query-> where('content','like','foo%');
}) - > get();

基于上述,您应该可以将约束放入您的评论中,其中Has的功能: / p>

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

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


I have these models, Venue, Review, User. a User can score several venues.
A venue has many reviews A review belongs to a venue and user

on my Venue model I have a method which calculates score of a venue:

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;
}

Here is the question: How can I retrieve those venues which score is >3
And how can I order results based on score

解决方案

Looking at http://laravel.com/docs/5.1/eloquent-relationships they use the following example:

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

Based on above, you should be able to put the constraint into your "reviews" whereHas function:

$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();

You can also get the count by adding ->count() either before or after ->get(), depending on your use case.

这篇关于基于模型法的过滤结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆