我已经对这个主题进行了大量的搜索,但在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模型的查询中并没有办法定义别名。