显示拉拉韦尔评价最高的餐厅

时间:2019-08-21 17:28:38

标签: php sql laravel laravel-5 eloquent

我有这张表评论,那就是存储带有餐厅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();

但这会保存每个餐厅的评分值,它不会计算评分并将其递增:

enter image description here

请帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

您不应将平均评论评分存储在评论表的每条记录上。相反,您可以通过查询来获取该值,我假设一个Restaurant有许多Review

Restaurant.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
}

当然,您可以在模型中定义此计算值,以便于访问:

Restaurant.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>

答案 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查询,该查询将返回所有行,然后对结果取平均值,因此该方法不适用于大型数据集。