我正在将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的数组?所以在我的前端,它不会显示为未定义。
我希望我能成功解释我正在尝试。
谢谢。
答案 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";