2012-09-28 77 views
5

我試圖創建一個查詢從一個Doctrine數據庫檢索對象,按特定的一對多關係的成員數量排序。如何根據關係的數量或成員對Doctrine DQL Query進行排序?

更具體地說:我有兩個實體:人員和聯邦。一個人可以是一個聯合會的成員(人有'聯合'關係),聯合會可能有個人(聯邦爲'人'關係)。

我想創建一個DQL查詢,它將返回聯盟列表,由有多少人是該聯盟的成員排序。沿着這些線:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people] 

這將是第一步。還有一個額外的第二步,我不知道是否可以用單個查詢來實現,這將在計數之前過濾關係的成員。像這樣:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)] 

這第二個將是最佳結果,但第一個滿足我的需求,如果第二種情況是不是在單個查詢可行性的。

在此先感謝。

回答

4

有在DQL 5個聚合函數可以使用(2.2學說):AVGCOUNTMINMAXSUM

下面的查詢應該工作:

SELECT f 
FROM AcmeStatsBundle:Federation f 
LEFT JOIN f.people p 
GROUP BY f.id 
ORDER BY COUNT(p) 
WHERE p.attr = :some_value 

更多DQL掛羊頭賣狗肉,我建議你查查official Doctrine docs

+2

感謝您的回答!我不得不對查詢做些微的修改,因爲我認爲如果不選擇它,你不能對ORDER BY進行排序。所以最後的查詢是這樣的: 'SELECT f,COUNT(p)as qtd FROM AcmeStatsBundle:Federation f LEFT JOIN f.people p WHERE p.attr =:some_value GROUP BY f.id ORDER BY qtr' :D –

6

你可以做線沿線的東西:

public function getFederationsOrderedByNumberOfPeople() 
{ 
    return $this->createQueryBuilder('f') 
     ->addSelect('COUNT(p) AS HIDDEN personCount'); 
     ->leftJoin('f.people', 'p'); 
     ->groupBy('f') 
     ->orderBy('personCount', 'DESC'); 
} 

教義2.2加入隱藏的關鍵字,就意味着選定字段將不會在結果,在這種情況下,這意味着你只是讓你的實體回來,而不是一個數組。

參考DQL選擇文檔:http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

+0

謝謝!這是做到這一點的方法! – Russ

相關問題