Eloquent关系上的聚合函数


Aggregate function on Eloquent relation

我已经对这个主题进行了大量的搜索,但在Eloquent中找不到一个清晰简洁的答案来确定它是否可能。

例如,我们有两个型号Manufacturer&一对多关系的汽车。

制造商.php

public function cars()
{
     return $this->hasMany('App'Car');
}

Car.php

public function manufacturer()
{
     return $this->belongsTo('App'Manufacturer');
}

使用普通的旧SQL,我可以有效地执行以下操作:

SELECT
m.id,
m.slug,
m.title,
m.content,
ROUND(AVG(NULLIF(c.status ,0))) AS 'score'
FROM 
manufacturers m
INNER JOIN cars c ON c.manufacturer_id = m.id 
GROUP BY m.id

我希望在雄辩方面也能做到这一点。我尝试了各种方法,但似乎看不出如何在汽车状态栏中包含AVG功能。

我可以得到所有的制造商和他们的相关汽车与以下:

$manufacturers = App'Manufacturer::with('cars')->get();

但是,如果我用DB::raw将AVG添加到查询事件中,它会抱怨该列不存在。是否可以在Eloquent中以这种方式检索AVG列作为结果的一部分,或者必须在检索完成后单独进行。

当然,我可以用DB查询生成器语法重写查询,但对于这个特定的用例,这有点违背直觉。

此外,我确实意识到Eloquent只是DB流利语法的包装器,但我想知道是否有可能在雄辩类型语法中做到这一点。

这里有一个雄辩的方法:

App'Manufacturer::join('cars as c', 'manufacturers.id', '=', 'c.manufacturer_id')
        ->select('manufacturers.id', 'manufacturers.slug', 'manufacturers.title', 'm.content', DB::raw("ROUND(AVG(NULLIF(c.status ,0))) AS 'score'"))
        ->with('cars')
        ->groupBy('manufacturers.id')
        ->get();

遗憾的是,在manufacturers表的eloqent模型的查询中并没有办法定义别名。