2011-11-18 40 views
6

Doctrine 2 QueryBuilder select()文の条件に基づいてカウントを取得する方法を知っている人はいますか?ここでDoctrine 2:選択項目のタイプ別選択項目

は、私がこれまで試したものだ...

私の最初の試みは)(当量)(カウントを試してみました。私が受け取ったエラーは、「期待される近いかっこが、等しい」ということです。

$qb->select($qb->expr()->count($qb->expr()->eq('t.id', '1'))) 

次はwith()を使ってcount()を試しました。私が受け取ったエラーには、「最大関数ネストレベルに達しました」と表示されます。

$qb->select($qb->expr()->count($qb->having('t.id', '1'))) 

次に、where()とeq()を使ってcount()を試しました。再度、「最大関数ネストレベルに達しました。」

$qb->select($qb->expr()->count($qb->where($qb->expr()->eq('t.id', '1')))) 

次に、これらのバリエーションをin()を使用して試しました。彼らの両方が、 『(』中の場合

$qb->select($qb->expr()->count($qb->expr()->in('t.id', array(1)))) 
$qb->select($qb->expr()->count($qb->expr()->in('t.id', 1))) 

()の例だから期待される構文エラー」を与える、私も同じ結果で、変数としておよびsetParameterを()を介して値を渡してみました。

ここで

は、MySQLの私はQueryBuilderのコードにしようとしているものの等価です:あなたはDQLの事で滞在する必要がある場合を除き

SELECT 
    SUM(IF(type.id = 1, 1, 0)) AS 'fords', 
    SUM(IF(type.id = 2, 1, 0)) AS 'hondas' 
FROM item 
JOIN type ON item.type_id = type.id 
+4

はあなたが使用できることを、忘れてはいけませんネイティブクエリ時にはそれはより速く、よりエレガントです。 –

答えて

6

、これが役立つことがあります。

public function MyAction() { 

    $this->doctrineContainer = Zend_Registry::get('doctrine'); 
    $em = $this->doctrineContainer->getEntityManager(); 

    $fords = $em->getRepository('My\Entity\Item')->findBy(array('type' => '1')); 
    $hondas = $em->getRepository('My\Entity\Item')->findBy(array('type' => '2')); 

    $fordQty = count($fords); 
    $hondaQty = count($hondas); 

} 

でいくつかの詳細:クエリビルダを使用してhttp://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#by-simple-conditions

+0

ありがとうFroger - ネイティブクエリを書くことになりましたが、これも便利になると確信しています。 – cantera

+1

@cantera同じ問題を抱えている人にとって参考になるかもしれないネイティブクエリを私たちに教えていただければ幸いです。 –

2

$query = $respository 
     ->createQueryBuilder('u') 
     ->select('count(u)') 
     ->getQuery() 
; 

$total = $query->getSingleResult(); 

:) QueryBuilderを使用して

2

、試してみてください。

$qb->select(" SUM(CASE WHEN t.id = 1 THEN 1 ELSE 0 END) as fords ") 
->addSelect(" SUM(CASE WHEN t.id = 2 THEN 1 ELSE 0 END) as hondas ") 
関連する問題