Использование сравнения в качестве псевдонима в select для Doctrine2 - PullRequest
4 голосов
/ 28 января 2012

Попытка сделать это в Doctrine2:

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

Но это выдает ошибку - если я снимаю скобки, я получаю другую ошибку.Как мне добиться этого сравнения m.status?

Спасибо

Ответы [ 3 ]

5 голосов
/ 17 января 2014

Doctrine 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 ...

Совершенно другое решение - написать пользовательскую функцию DQL .

0 голосов
/ 14 сентября 2012

Вы можете использовать предложенное здесь решение: Кумулятивный DQL с Doctrine

При работе с сущностями помните, что при добавлении селекторов запрос возвращает массив для каждого результата:

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

Итерация по $ res вернет массив:

foreach($res as $mixed){
  echo get_class($mixed[0]); //$mixed[0] contains the BlogPost
  echo $mixed['dummy']; //displays the dummy result (5)
}
0 голосов
/ 28 января 2012

проверить это: 13.2.4. Использование классов Expr * для создания условных выражений

используя методы Expression, вы можете сделать что-то вроде:

$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();   
...