显示 laravel 中评分最高的餐厅
Posted
技术标签:
【中文标题】显示 laravel 中评分最高的餐厅【英文标题】:displaying most rated restaurants in laravel 【发布时间】:2019-08-21 17:28:38 【问题描述】:我有这个表评论,它存储用户的评论和餐厅 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();
但这会保存每家餐厅的评分值,它不会计算评分并增加评分:
请帮忙,提前谢谢。
【问题讨论】:
【参考方案1】:您不应在评论表的每条记录上存储平均评论评分。相反,您可以通过查询获得该值,我假设 Restaurant
有很多 Review
s:
餐厅.php
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
当然,您可以在模型中定义此计算值以便于访问:
餐厅.php
// ...
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>
【讨论】:
问题是我希望存储这个值,以便我可以编写查询来计算评分最高的餐厅 @nerdme 但它没有任何意义。这就是为什么:最后一条记录('rating_count')将是唯一准确的记录,所有其他记录将显示通过数据。因此,您正在存储不准确的数据。另外,您说您要计算评分最高的餐厅。这也可以使用 eloquent 来实现。 你如何才能在 eloquent 中做到这一点 @nerdme 检查this.【参考方案2】:您可以在 PHP 中对所有 reviews
的集合进行计算:
// Restaurant.php
class Restaurant
public function reviews()
return $this->hasMany('App\Review');
public function avgRating()
return $this->reviews->avg('rating');
利用两个数据库表之间的Eloquent关系,使用avg()
function计算平均review,传入要平均的列。
然后在您的代码中,您可以调用$restaurant->avgRating()
。请注意,每次调用都会执行一个 SQL 查询,该查询会返回所有行,然后对结果进行平均,因此此方法无法很好地适用于大型数据集。
【讨论】:
我如何存储这个值以便执行 SQL 查询以获得最高评价?以上是关于显示 laravel 中评分最高的餐厅的主要内容,如果未能解决你的问题,请参考以下文章