Eloquent关系的聚合函数

时间:2016-05-12 10:11:20

标签: php laravel laravel-5 eloquent

我已经对这个主题进行了大量的搜索,但是在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流利语法的包装器,但我想知道是否可以用雄辩的类型语法来做到这一点。

1 个答案:

答案 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模型时无法定义别名。