laravel模型:引用模型的平均值(子查询)

x3naxklr  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(518)

我试图得到一个引用模型列的平均值。我有一个漫画数据库,其中包含漫画和每个漫画有一个评级。每一部漫画都属于一个系列。模型 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)'

我想我完全迷路了,不确定自己当初是否选择了正确的道路。我希望你能给个建议/暗示。
谢谢。

ar7v8xwq

ar7v8xwq1#

虽然我不明白这个问题,但如果我不使用雄辩的语言,问题就解决了 avg 方法并将其替换为 selectRaw :

public function scopeWithAverageRating($query)
{
  $query->addSubSelect(
    'rating',
    Comic::selectRaw('avg(comic_rating)')
      ->whereRaw('series_id = series.series_id')
  );
}

相关问题