【问题标题】:displaying most rated restaurants in laravel显示 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();

但这会保存每家餐厅的评分值,它不会计算评分并增加评分:

请帮忙,提前谢谢。

【问题讨论】:

    标签: php sql laravel laravel-5 eloquent


    【解决方案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 查询以获得最高评价?
    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多