我在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
。
答案 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以及案例设置为适合您的值。
它应该工作。希望它有所帮助。