2012-11-24 54 views
18

從Doctrine 2.1開始,支持CASE WHEN語句,但沒有很多文檔。我的目標是建立一個布爾值來判斷一個照片已被用戶收藏:在Doctrine2實體中存儲「CASE WHEN」條件

 ->addSelect("CASE WHEN f.photo is NULL THEN false ELSE true END as is_favorited") 
     ->leftJoin("p.favorites", 'f', 'WITH', 'f.owner = :viewer') 
     ->orderBy("p.date_posted", "DESC") 
     ->setParameters(array("owner" => $owner, "viewer" => $viewer)); 

但是因爲我的實體正在轉化成JMSSerializer JSON,我想設置的情況下結果作爲該實體的財產。

 ->addSelect("CASE WHEN f.photo is NULL THEN false ELSE true END as p.is_favorited") 

但unforunately主義似乎並不喜歡這樣的:

[Syntax Error] line 0, col 65: Error: Expected Doctrine\ORM\Query\Lexer::T_FROM, got '.'

是否有設置DQL創建一個實體性的方法嗎?

+0

是否與DQL的結果集映射的工作? – gremo

+0

''> addSelect('f.photo IS NOT NULL')'不具有相同的效果(但也許不會絆倒Doctrine)? –

+0

你試過簡單地將'CASE'封裝在'()'中嗎?(例如,當f.photo爲NULL,否則爲false,否則爲真END)如同is_favorited'? – prodigitalson

回答

2

無法直接在查詢中設置屬性值。相反,您可以將未映射的字段添加到實體中,然後遍歷結果並進行設置。在這種情況下,JMSSerializer序列化該字段,您可以在其上設置必要的類型和其他元信息。

0

你可以試試這個。它將與DQL

->addSelect("SUM(CASE WHEN f.photo is NULL THEN 0 ELSE 1 END) as p.is_favorited"); 
+0

我不再有最初創建這個問題的設置,但這可能是一個值得解決的問題。它實際上工作嗎? – Dandy

-1

工作從它聽起來像它的抱怨錯誤,因爲你沒有在你的SELECT語句中列出的表。

+0

直接從存儲庫創建查詢時,您不需要指定「from()」,因爲Doctrine會自動爲您填充。例如,「$ repository-> createQueryBuilder('p')」 – Dandy

-1

你只需要添加

->from() 

線,使該表名爲「F」和

+0

直接從存儲庫創建查詢時,您不需要指定「from()」,因爲Doctrine會自動爲您填充。 – Dandy