試圖做到這一點在Doctrine2:使用比較,因爲在選擇別名Doctrine2
...->createQuery('SELECT m.id, (m.status != 1) as verified...
但是,這將引發一個錯誤 - 如果我帶括號關我得到另一個錯誤。我如何實現這種m.status比較?
感謝
試圖做到這一點在Doctrine2:使用比較,因爲在選擇別名Doctrine2
...->createQuery('SELECT m.id, (m.status != 1) as verified...
但是,這將引發一個錯誤 - 如果我帶括號關我得到另一個錯誤。我如何實現這種m.status比較?
感謝
檢查了這一點: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();
我不想用條件來過濾數據 - 只是希望根據返回的結果將結果集設置爲布爾別名。這在sql或doctrine 1中是非常直接的,但doctrine2 .. – cyberwombat 2012-01-29 01:21:45
在哪裏添加條件很容易。我的問題和原始海報的問題是在選擇部分使用此表達式。例如,這個評論的作者和這個問題的作者是一樣的嗎?將結果放入「is_original_poster」中。 – afilina 2013-10-19 15:57:19
您可以使用這裏提出的解決方案: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)
}
使用addSelect()與將其直接放在原始的select()或createQuery()中相同。問題在於比較不正確解析,而不是添加更多選擇部分。 – afilina 2013-10-19 16:00:38
原則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。
謝謝!很高興知道。 – flu 2014-06-10 12:16:57
我有完全相同的問題。 DQL中的比較似乎沒有正確解析。 – afilina 2013-10-19 16:01:12