显示 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 有很多 Reviews:

餐厅.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-&gt;avgRating()。请注意,每次调用都会执行一个 SQL 查询,该查询会返回所有行,然后对结果进行平均,因此此方法无法很好地适用于大型数据集。

【讨论】:

我如何存储这个值以便执行 SQL 查询以获得最高评价?

以上是关于显示 laravel 中评分最高的餐厅的主要内容,如果未能解决你的问题,请参考以下文章

Swift 如何为使用 Firebase 投票的用户添加 5 星评分

第1组 团队Git现场编程实战

第01组 团队Git现场编程实战

第01组 团队Git现场编程实战

第01组 团队Git现场编程实战

如何在 laravel 中获取所有平均评分的数据