我有一个包含以下字段的餐厅表
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 我想计算每个餐厅的平均评分,并在餐厅视图上将其显示为数字
答案 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')
: