2016-05-12 120 views
0

我已经做了大量的搜索这个主题,但无法找到一个清晰和简明的答案,是否有可能在雄辩。雄辩关系上的聚合函数

说例如我们有两个模型制造商&汽车与一对多的关系。

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(); 

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

我当然可以用数据库查询生成器语法重写查询,但对于这种特殊用例,它有点直观。

另外我也意识到Eloquent只是数据库流利语法的包装,但我想知道是否可以在雄辩类型语法中做到这一点。

回答

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(); 

不幸的是,没有办法在eloqent模型的查询定义别名manufacturers表。

+0

啊对,谢谢我看到了。基本上默认查询生成器的语法与“与”投入也急于加载。太感谢了。 – jiraiya