有条件的学说ORDER BY

时间:2015-01-14 23:33:35

标签: mysql doctrine-orm doctrine

我在Doctrine中有以下内容:

$query = $this->_em
              ->createQuery("SELECT f
              FROM models\Food f 
              WHERE f.name LIKE :query 
              OR f.country LIKE :query
              OR f.code = :query_full
              ORDER BY f.code != :query_full, f.rank ASC")
              ->setParameters(
                  array(
                     "query" => "%$query%",
                      "query_full" => $query
               ));

该查询在MySQL Workbench中有效,但Doctrine会引发异常:

 [Syntax Error] line 0, col 359: Error: Expected end of string, got '!'

如何在Doctrine中编写该查询?如果查询匹配,我们的想法是始终在结果之上f.code

1 个答案:

答案 0 :(得分:2)

您可以尝试多种方法:使用SQL,QueryBuilder,DQL ......除了具有本机SQL的方法之外,其余方法将需要在查询的选择部分使用CASE语句。

按照您的方法,您的查询将是:

$query = $this->_em
              ->createQuery("SELECT f, (CASE WHEN (f.id != :query_full) THEN 1 ELSE 0 END) as myOrderBy
              FROM models\Food f 
              WHERE f.name LIKE :query 
              OR f.country LIKE :query
              OR f.code = :query_full
              ORDER BY myOrderBy ASC, f.rank ASC")
              ->setParameters(
                  array(
                     "query" => "%$query%",
                      "query_full" => $query
               ));

您必须将ASC或DESC以及案例设置为适合您的值。

它应该工作。希望它有所帮助。