2016-05-12 118 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