Доктрина 2: Подсчет предметов по типу в избранном - PullRequest
7 голосов
/ 18 ноября 2011

Кто-нибудь знает, как получить счет на основе условия в утверждении Doctrine 2 QueryBuilder select ()?

Вот что я пробовал до сих пор ...

Мой первыйпопытка состояла в том, чтобы попробовать count () с помощью eq ().Я получаю сообщение об ошибке «Ожидаются закрывающие скобки, получено равное».

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

Затем я попытался count () с помощью has ().Я получаю сообщение об ошибке «Максимальный уровень вложенности функций достигнут».

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

Затем я попытался использовать count () с помощью where () и eq ().Я снова получил «Максимальный уровень вложенности функций достигнут».

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

Затем я попробовал эти варианты, используя in ().Они оба дают синтаксическую ошибку «Ожидается FROM, получил» ('

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

. Для примеров in () я также попытался передать значение как переменную и через setParameter (), с тем же результатом.

Вот эквивалент MySQL того, что я пытаюсь кодировать в QueryBuilder:

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

Ответы [ 3 ]

7 голосов
/ 30 ноября 2011

За исключением случаев, когда вам нужно остаться с DQL, это может помочь:

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 /ссылка / рабочий-с objects.html # по-простодушные условиях

4 голосов
/ 31 августа 2014

Используя QueryBuilder, попробуйте:

$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 ")
3 голосов
/ 13 февраля 2013

Использование построителя запросов:

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

$total = $query->getSingleResult();

:)

...