2015-12-01 88 views
1

我有以下查詢,我需要修改與symfony2一起使用。錯誤:預計文字,得到'CASE'

SELECT someColumn, COUNT(*) AS n, 
SUM(IF(STATUS = 20,1,0)) AS sent 
FROM someTable 
WHERE ID = :id; 

我做了什麼至今:

$query = ("SELECT myEntity.someField AS someColumn, 
      SUM(CASE WHEN myEntity.status = '20' then 1 ELSE 0 END) as sent 
      FROM AppRoot\MyBundle\Entity\MyEntity myEntity 
      WHERE myEntity.id = :id 
      "); 

,但我得到了可怕的錯誤:

Error: Expected Literal, got 'CASE' 
+0

不需要GROUP BY? – jarlh

+0

@jarlh我稍後需要它,但目前我的主要問題是這個錯誤,沒有任何意義,以及如何將COUNT(*)從sql轉換爲dql。 – tutak

+0

您是否嘗試刪除','在下面一行的結尾處:'SUM(case when myEntity.status ='20'then 1 ELSE 0 END)as sent,'(不知道它會解決您的問題,但你不應該在'FROM'之前加一個逗號) – Snroki

回答

0

假設你從EntityRepository調用它,你可以實例\主義\ ORM \ QueryBuilder像這樣:

$em = $this->_em->createQueryBuilder(); 

接下來,您可以使用構建查詢:

$qb->select(array(
    'myEntity.someField as someColumn', 
    'count(myEntity) as n', 
    'SUM(CASE WHEN myEntity.status = :status then 1 ELSE 0 END) as sent', 
    ... // add all the columns you need 
)) 
    ->from('AppRoot\MyBundle\Entity\MyEntity','MyEntity') 
    ->where($qb->expr()->eq('myEntity.id', ':id')) 
    ->setParameters(array(
     'status'=>'20', 
     'id' => $theEntityId 
)); 

最後,你可以檢索你的結果是這樣的:

$qb->getQuery()->getResult(); 

,或者如果你喜歡一個普通的舊式陣列:

$qb->getQuery()->getArrayResult(); 

這應該工作,你可以檢查生成的查詢:

$qb->getQuery()->getDQL(); // get the Doctrine Query Language query 
$qb->getQuery()->getSQL(); // get the SQL generated query 
+0

我仍然得到「錯誤:預計文字,得到'CASE' – tutak

+0

我懷疑或許教義不承認運算符CASE,雖然它應該是,版本2.1.6 – tutak

+0

只是要了解:如果您得到相同的錯誤if你把SUM關了嗎? –