【问题标题】:Case not work in doctrine query builder where clause案例在学说查询生成器 where 子句中不起作用
【发布时间】:2017-10-08 23:33:36
【问题描述】:

我在学说的 where 子句中遇到了 mysql CASE 的问题,

 $rides_q1 = $em->getRepository('IRRideBundle:Ride');
    $query = $rides_q1->createQueryBuilder('a')
                     ->where('(CASE WHEN a.ephemeral = 1 THEN a.date_beginning < NOW() AND a.date_ending > NOW()ELSE a.ephemeral = 0 END) AND a.active = 1 AND a.status = 5')                  
     ->getQuery();
$ridesQuery = $query->execute();



**[Syntax Error] line 0, col 93: Error: Expected Doctrine\ORM\Query\Lexer::T_ELSE, got '<'**

[2/2] QueryException: [Syntax Error] line 0, col 93: Error: Expected Doctrine\ORM\Query\Lexer::T_ELSE, got '<'   +
[1/2] QueryException: SELECT a FROM IR\RideBundle\Entity\Ride a WHERE (CASE WHEN ephemeral = 1 THEN date_beginning < NOW() AND date_ending > NOW()ELSE ephemeral = 0 END) 

我想准备这个 sql 查询,它可以在 phpmyadmin 中正常工作

SELECT * FROM ride WHERE (CASE WHEN ephemeral = 1 THEN date_beginning < NOW() AND date_ending > NOW()ELSE ephemeral = 0 END) AND active = 1 AND `status_id` = 5 ORDER BY `date_ending` DESC

【问题讨论】:

  • 通常你不会在 WHERE 中使用 CASE。使用布尔逻辑

标签: mysql symfony doctrine-orm doctrine symfony-2.8


【解决方案1】:

WHERE 中的 CASE 表达式错误。您可以将其转换为正常的复合条件,例如

(CASE WHEN a.ephemeral = 1 THEN a.date_beginning < NOW() AND a.date_ending > NOW()ELSE a.ephemeral = 0 END)

SELECT * FROM ride
WHERE ((a.ephemeral = 1 
       and a.date_beginning < NOW() 
       AND a.date_ending > NOW()) 
  OR a.ephemeral = 0)
  AND a.active = 1 
  AND a.status = 5
ORDER BY `date_ending` DESC

【讨论】:

  • 是的,我可以省略 CASE 并使用简单的 AND OR 查询,谢谢
  • @JaysukhMaghodiya,如果有帮助,请考虑接受答案。
【解决方案2】:

方法createQueryBuilder() 当您需要使用 Doctrine 构建查询时使用。 例如:

 public function findPostsQuery()
  {
      $qb = $this->createQueryBuilder('p');
      $qb
          ->where('p.postStatus = :postStatus')
          ->orderBy('p.id', 'DESC')
          ->setParameter('postStatus', true);
      return $qb->getQuery();
  } 


如果您不会创建自定义查询 - 使用 createQuery() 方法。 例如:

 $em = $this->getDoctrine()->getManager();
 $query = $em->createQuery(
     'SELECT p
     FROM AppBundle:Product p
     WHERE p.price > :price
     ORDER BY p.price ASC'
 )->setParameter('price', 19.99);

 $products = $query->getResult();

官方documentation帮你

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2011-12-04
    相关资源
    最近更新 更多