获取有很多关系数据Laravel并使用avg函数

时间:2018-07-05 22:48:50

标签: php laravel laravel-5 vue.js vuejs2

我正在将Laravel 5与vue js一起使用。基本上,我正在使用axios来获取数据,并尝试使用vue js v-for指令在网页上显示。 我在数据库中有这样的表:

ratings Table

id review_id rating

然后我有一个

reviews table

id review

它们之间存在一对多的关系。所以在我的Review模型中,我有方法

 public function ratings()
    {
        return $this->hasMany('App\Rating')
            ->selectRaw('review_id,AVG(rating) AS average_rating')
            ->groupBy('review_id');
    }

所以在这里,我想获取评论列表及其平均评分。所以在我的控制器中,我正在这样做:

  public function getAllReviews(Request $request)
    {
        $reviews = Review::with('ratings')->get();

        return $reviews;
    }

所以我得到了结果,但问题是每条评论都没有评分记录,因此返回null?也许... 当我尝试在vue模板中进行渲染时,会引发错误undefined,因为在我们的收藏集中,某些评论没有评分。

现在我的问题是:我可以做些什么,如果特定评论的评分中没有记录,是否可以添加值为0的数组?所以在我的前端,它不会显示为未定义。

我希望我能成功解释我正在尝试。

谢谢。

4 个答案:

答案 0 :(得分:0)

我建议使用基本关系和经过修改的withCount()

public function ratings() {
    return $this->hasMany('App\Rating');
}

$reviews = Review::withCount(['ratings as average_rating' => function($query) {
    $query->select(DB::raw('coalesce(avg(rating),0)'));
}])->get();

答案 1 :(得分:0)

您可以这样操作:

public function getAllReviews(Request $request)
{
    $reviews = Review::selectRaw('*, IFNULL((SELECT AVG(rating) FROM ratings where ratings.review_id = reviews.id), 0) as avg_rating')->get();

    return $reviews;
}

答案 2 :(得分:0)

public function showProduct($id)
    {   

        $data = Product::where('category_id',$id)
                ->selectRaw('*, IFNULL((SELECT AVG(value) FROM ratings where ratings.product_id = products.id), 0) as avg_rating')
                ->get();

        return view('ecommerce.web.productsOfcategory',compact('data'));
    }

答案 3 :(得分:0)

$avgQuery = "IFNULL((SELECT AVG(ratings.rating) FROM ratings WHERE ratings.review_id = reviews.id),'No Ratings') as avg_rating";

$reviews = Review::query()->selectRaw("reviews.*, $avgQuery")->get();

//SQL Query
$sqlQuery = "select reviews.*, IFNULL((SELECT AVG(ratings.rating) FROM ratings where ratings.review_id= ratings.id), 'No ratings') as avg_rating FROM reviews";