从多态关系中获取平均值

Get Average from Polymorphic Relation

我正在尝试获取评论数和平均评论评分。

我有桌子:

表格:

椅子:

评论:

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();