2012-01-27 59 views
4

試圖做到這一點在Doctrine2:使用比較,因爲在選擇別名Doctrine2

...->createQuery('SELECT m.id, (m.status != 1) as verified... 

但是,這將引發一個錯誤 - 如果我帶括號關我得到另一個錯誤。我如何實現這種m.status比較?

感謝

+0

我有完全相同的問題。 DQL中的比較似乎沒有正確解析。 – afilina 2013-10-19 16:01:12

回答

-2

檢查了這一點:13.2.4. Using Expr* classes to create conditionals

使用的表達方式,你可以這樣做:

$qb = $this->entityManager->createQueryBuilder(); 

$query = $qb->select('m.id') 
      ->from('Entities\MyEntity', 'm') 
      /*neq() is the "not equal" comparison function*/ 
      ->where($qb->expr()->neq('m.status', $someValue)), 
      ->getQuery(); 
+0

我不想用條件來過濾數據 - 只是希望根據返回的結果將結果集設置爲布爾別名。這在sql或doctrine 1中是非常直接的,但doctrine2 .. – cyberwombat 2012-01-29 01:21:45

+1

在哪裏添加條件很容易。我的問題和原始海報的問題是在選擇部分使用此表達式。例如,這個評論的作者和這個問題的作者是一樣的嗎?將結果放入「is_original_poster」中。 – afilina 2013-10-19 15:57:19

-1

您可以使用這裏提出的解決方案:Cumulative DQL with Doctrine

當工作實體,請記住,添加選擇將使查詢返回每個結果的數組:

$res = $em->createQueryBuilder() 
    ->from('BlogPost', 'p') 
    ->select('p') 
    ->addSelect('(2+3) AS dummy') 
    ->getQuery()->getResult(); 

遍歷$水庫將返回一個數組:

foreach($res as $mixed){ 
    echo get_class($mixed[0]); //$mixed[0] contains the BlogPost 
    echo $mixed['dummy']; //displays the dummy result (5) 
} 
+0

使用addSelect()與將其直接放在原始的select()或createQuery()中相同。問題在於比較不正確解析,而不是添加更多選擇部分。 – afilina 2013-10-19 16:00:38

5

原則2不支持SELECT子句(至少沒有達到2.3,不知道2.4)在這些比較。

可以使用CASE表達式作爲解決方法:

SELECT m.id, CASE WHEN m.status != 1 THEN 1 ELSE 0 END AS verified ... 

或:

SELECT m.id, CASE WHEN m.status = 1 THEN 0 ELSE 1 END AS verified ... 

如果您需要verified一個ORDER BY子句(或類似的東西),但實際上並不需要它的結果,你可以使用HIDDEN表達式:

SELECT m.id, CASE WHEN m.status = 1 THEN 0 ELSE 1 END AS HIDDEN verified ... 

一個完全不同的解決方案是寫一個custom DQL function

+0

謝謝!很高興知道。 – flu 2014-06-10 12:16:57