在select for Doctrine2中使用比较作为别名

时间:2012-01-27 23:56:13

标签: mysql doctrine doctrine-orm

尝试在Doctrine2中执行此操作:

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

但是这会引发错误 - 如果我取消括号,我会收到另一个错误。我如何实现这种m.status比较?

由于

3 个答案:

答案 0 :(得分:5)

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

完全不同的解决方案是编写custom DQL function

答案 1 :(得分:-1)

您可以使用此处提出的解决方案:Cumulative DQL with 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)
}

答案 2 :(得分:-2)

检查一下:13.2.4. Using Expr* classes to create conditionals

使用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();