我已经对这个主题进行了大量的搜索,但是在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列作为结果的一部分,或者必须在检索完成后单独完成。
我当然可以在数据库查询构建器语法中重写查询,但对于这个特定的用例,它有点反直觉。
此外,我确实认识到Eloquent只是DB流利语法的包装器,但我想知道是否可以用雄辩的类型语法来做到这一点。
答案 0 :(得分:0)
这是雄辩的方式:
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模型时无法定义别名。