我有这张表评论,那就是存储带有餐厅ID的用户评论。这是评论的存储功能。我需要它来保存平均评分并将其存储在评分计数列中
$review = new Review;
$review->user_id = auth()->user()->id;
$review->restaurant_id = $request->get('restaurant_id');
$review->value = $request->input('value');
$review->rating = $request->input('rating');
$avgRating = $review->avg('rating');
$review->rating_count = round($avgRating, 1);
$review->save();
但这会保存每个餐厅的评分值,它不会计算评分并将其递增:
请帮助,谢谢。
答案 0 :(得分:1)
您不应将平均评论评分存储在评论表的每条记录上。相反,您可以通过查询来获取该值,我假设一个Restaurant
有许多Review
:
public function reviews()
{
return $this->hasMany(Review::class);
}
然后在您的控制器中:
public function myCoolFunction()
{
$restaurant = Restaurant::with('reviews')->find(1);
$avg = $restaurant->reviews->avg('rating'); // '4.67' for example
}
当然,您可以在模型中定义此计算值,以便于访问:
// ...
public function getAvgRatingAttribute()
{
return $this->reviews()->avg('rating');
}
现在在您的控制器中查看:
public function myCoolFunction()
{
$restaurant = Restaurant::find(1);
return view('my_view')->with('restaurant', $restaurant);
}
然后:
<p>{{ $restaurant->avg_rating }}</p>
答案 1 :(得分:0)
您可以对PHP中所有reviews
的集合进行计算:
// Restaurant.php
class Restaurant
{
public function reviews()
{
return $this->hasMany('App\Review');
}
public function avgRating()
{
return $this->reviews->avg('rating');
}
}
使用两个数据库表之间的雄辩关系,使用avg()
function计算平均评论,并传递要平均的列。
然后在您的代码中,您可以调用$restaurant->avgRating()
。请注意,每次调用都将执行SQL查询,该查询将返回所有行,然后对结果取平均值,因此该方法不适用于大型数据集。