我试图得到一个引用模型列的平均值。我有一个漫画数据库,其中包含漫画和每个漫画有一个评级。每一部漫画都属于一个系列。模型 Series
应该能拿到所有漫画的平均分。因此,我认为这是整个漫画系列的质量。
我正在使用这个数据库模式和相应的laravel模型 Series
.
系列.php
\\ [...]
public function comics()
{
return $this->hasMany(Comic::class, 'series_id', 'series_id');
}
我试过的
我试着改编我在乔纳森·雷因克的《拉拉康》课上看到的一个子集,在另一个案例中,我试图找到一个系列的第一部漫画(第3章的要求)https://github.com/reinink/laracon2018):
系列.php
public function scopeWithAverageRating($query)
{
// using a Builder::macro in AppServiceProvider.php
$query->addSubSelect(
'rating',
Comic::select('comic_id')
->whereRaw('series_id = series.series_id')
->avg('comic_rating')
);
}
appserviceprovider.php文件
Builder::macro('addSubSelect', function ($column, $query) {
if (is_null($this->getQuery()->columns)) {
$this->select($this->getQuery()->from . '.*');
}
return $this->selectSub($query->limit(1)->getQuery(), $column);
});
但在tinker shell中,我只得到一个sql错误:
>>> $s = new App\Series;
>>> $s->withAverageRating();
Illuminate/Database/QueryException with message 'SQLSTATE[42S22]:
Column not found: 1054 Unknown column 'series.series_id' in 'where clause'
(SQL: select avg(`comic_rating`) as aggregate from `comics` where series_id = series.series_id)'
我想我完全迷路了,不确定自己当初是否选择了正确的道路。我希望你能给个建议/暗示。
谢谢。
1条答案
按热度按时间ar7v8xwq1#
虽然我不明白这个问题,但如果我不使用雄辩的语言,问题就解决了
avg
方法并将其替换为selectRaw
: