从多态关系中获取平均值
Get Average from Polymorphic Relation
我正在尝试获取评论数和平均评论评分。
我有桌子:
表格:
- 编号
- .......
椅子:
- 编号
- .......
评论:
- 编号
- 评分
- reviewable_id
- reviewable_type
class Review extends Model {
public function reviewable() {
return $this->morphTo();
}
}
class Tables extends Model {
public function reviews() {
return $this->morphMany('App\Review', 'reviewable');
}
public function avg_rating() {
return $this->reviews()
->selectRaw('avg(rating) as avgRating, review_id')
->groupBy('review_id');
}
}
我试过:
Table::with(['avg_rating'])->withCount('reviews')->where(function($q) use ($regex_terms, $terms){
$q->where('name', 'REGEXP', $regex_terms);
})->get();
但是得到“'field list' 中的未知列 'review_id'”或尝试使用“hasmany”的变体只得到一个空数组或一个包含评论的数组。只是想知道完成此操作的最佳方法是什么,或者我是否必须循环查看评论并手动计算或第二个原始查询
我有这个但不确定它在 Eloquent:
中是否有效或最佳实践
$tables->each(function ($table) {
$table->review_average = DB::table('reviews')
->select(DB::raw("ROUND( avg(rating), 2) as avg"))
->where("reviewable_id", "=", $table->id)->first()->avg;
});
显然,我使用的是基于Laravel 6框架的Lumen,所以我之前尝试“withAvg”时一直抛出“找不到方法”的错误。但是在搜索那个方法后,我看到它需要更高版本的Laravel。因此,更新到 Laravel/Lumen 8 允许我使用“withAvg”函数。
所以现在我的查询生成器语句如下所示:
Table::with(['avg_rating'])->withCount('reviews')->withAvg("reviews", "rating")->where(function($q) use ($regex_terms, $terms){
$q->where('name', 'REGEXP', $regex_terms);
})->get();
我正在尝试获取评论数和平均评论评分。
我有桌子:
表格:
- 编号
- .......
椅子:
- 编号
- .......
评论:
- 编号
- 评分
- reviewable_id
- reviewable_type
class Review extends Model {
public function reviewable() {
return $this->morphTo();
}
}
class Tables extends Model {
public function reviews() {
return $this->morphMany('App\Review', 'reviewable');
}
public function avg_rating() {
return $this->reviews()
->selectRaw('avg(rating) as avgRating, review_id')
->groupBy('review_id');
}
}
我试过:
Table::with(['avg_rating'])->withCount('reviews')->where(function($q) use ($regex_terms, $terms){
$q->where('name', 'REGEXP', $regex_terms);
})->get();
但是得到“'field list' 中的未知列 'review_id'”或尝试使用“hasmany”的变体只得到一个空数组或一个包含评论的数组。只是想知道完成此操作的最佳方法是什么,或者我是否必须循环查看评论并手动计算或第二个原始查询
我有这个但不确定它在 Eloquent:
中是否有效或最佳实践$tables->each(function ($table) {
$table->review_average = DB::table('reviews')
->select(DB::raw("ROUND( avg(rating), 2) as avg"))
->where("reviewable_id", "=", $table->id)->first()->avg;
});
显然,我使用的是基于Laravel 6框架的Lumen,所以我之前尝试“withAvg”时一直抛出“找不到方法”的错误。但是在搜索那个方法后,我看到它需要更高版本的Laravel。因此,更新到 Laravel/Lumen 8 允许我使用“withAvg”函数。
所以现在我的查询生成器语句如下所示:
Table::with(['avg_rating'])->withCount('reviews')->withAvg("reviews", "rating")->where(function($q) use ($regex_terms, $terms){
$q->where('name', 'REGEXP', $regex_terms);
})->get();