计算拉拉韦尔的平均餐厅评价

时间:2019-07-19 12:00:11

标签: javascript jquery laravel

我有一个包含以下字段的餐厅表

Schema::create('restaurants', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->string('name');
            $table->text('menu');
            $table->string('hours');
            $table->string('contact');
            $table->string('payment');

包括rating_count,用于存储我稍后添加的平均评分

[我有一个评论表,其中存储了每个餐厅的评分]

https://i.stack.imgur.com/MXudX.png 我想计算每个餐厅的平均评分,并在餐厅视图上将其显示为数字

3 个答案:

答案 0 :(得分:1)

您需要这样在餐厅模型中设置关系:

public function reviews()
{
    return $this->hasMany(Review::class);
}

然后要计算评分,您可以添加另一种方法:

public function rating()
{
    $totalReviews = $this->reviews->count();

    if($totalReviews)
    {
        $totalRating = $this->reviews->sum('rating');

        return number_format($totalRating / $totalReviews, 1);
    }

    return 0;
}

然后使用它:

$restaurant = Restaurant::find(1)->with('reviews');

$restaurant->rating(); // should give you what you need.

-编辑

在您的餐厅模型中添加这样的访问器:

protected $appends = ['rating_count'];

public function getRatingCountAttribute()
{
    return $this->reviews->avg('rating');
}

然后使用它:

$restaurant->rating_count;

答案 1 :(得分:0)

获取所有带有评论的餐厅。

$restaurants = Restaurants::with('reviews')->get();

环顾餐厅,并使用收集方法平均值计算字段。

foreach ($restaurants as $restaurant) {
    $restaurant->rating_count = $restaurant->reviews->avg('rating');
    $restaurant->save();
} 

答案 2 :(得分:0)

在餐厅模型中,尽可能使定义关系的方法尽可能简单。

public function reviews() {
    return $this->hasMany('App\Review');
}

现在您可以使用此关系来获取费率,您可以添加模型中非列的属性作为附加属性。

protected $appends = ['rate'];

,然后具有分配值的功能:

public functions getRateAttribute() {
     return $this->reviews->avg('rate') ?? 0;
}

问题是,顾名思义,附加属性始终附加在模型实例上。

因此,如果您只执行以下操作:

$restaurant= Restaurant::first();

即使您不需要费率,laravel仍然会为您准备好$restaurant->rate,因此它将进行平均查询。

还请注意Laravel的avg('column_name')

  • 当不存在数据时为空
  • 如果对非数字列求平均值,它的值约为0.0
  • 如果存在的值大于2个小数点(大多数为4个),则以3.9265格式给出有效值