2011-06-05 100 views
0

我想整理我的模型的關聯ArrayCollection有商,像這樣(我知道下面的代碼不工作):Doctrine2 @OrderBy計算字段?

/** 
* @OneToMany (targetEntity="Review", mappedBy="product") 
* @OrderBy ({"voted_up/voted_down" = "DESC"}) 
*/ 
protected $reviews; 

在模型中定義的東西這可能直接或者我需要簡單地請求數據時在ArrayCollection上使用sort()?

+0

您是否認真使用字段名稱作爲「voted_up/voted_down」作爲名稱?我不想做出評判。但我認爲這是某種墮落。 – renoirb 2012-10-04 15:42:07

+0

對不起,沒有。澄清,這是一個計算。 「voted_up」是一個int字段,「voted_down」是一個int字段。 – iamdev 2012-10-26 14:05:25

回答

2

使用Doctrine 2.1,您可以直接在模型定義中執行此操作,但不能使用@OrderBy。您可以在模型級別定義DQL片段,就像在規定的2.1 Beta release notes

命名DQL查詢在元數據:可以使用@NamedQueries(@NamedQuery(name =「foo」的映射文件添加DQL查詢,查詢= 「DQL」))並通過$ em-> getRepository() - > getNamedQuery()訪問它們。

因此,你可以用ORDER BY關鍵字創建DQL查詢,像:

SELECT c.id, c.text, (c.voted_up/c.voted_down) AS sortkey FROM Comment c 
ORDER BY sortkey DESC 

所以,我想你這個註釋添加到模型中定義的,是這樣的:

/** 
* @Entity 
* @Table(name="comment") 
* @NamedQueries(@NamedQuery(name="sortedComment", query="SELECT c.id, c.text, (c.voted_up/c.voted_down) AS sortkey FROM Comment c ORDER BY sortkey DESC")) 
*/ 
class Comment { 
    ... 
} 

,然後在你的代碼調用:

$em->getRepository("Comment")->getNamedQuery("sortedComment"); 

我沒有測試日是,但你明白了。

+0

這是個好消息!我仍然在使用2.0,所以我會在等待穩定2.1的時候破解一個解決方案。非常感謝您的答案! – iamdev 2011-06-07 20:08:46