我想在几个列上使用orderBY,但它们应该像一个列一样。 该表看起来像这样:
col1 | col2
5 |
2 |
| 3
7 |
| 1
| 1
结果应该是这样的:
col1 | col2
| 1
| 1
2 |
| 3
5 |
7 |
如果我们使用原始SQL,则会有方法,例如使用COALESCE
。
但是如何在Doctrine QueryBuilder中实现呢?
我尝试了这样的命令:
qb->orderBy("COALESCE(col1, col2)", "DESC");
就像这样
qb->add("orderBy", "COALESCE(col1, col2) DESC");
但两次我都被抛出以下错误:
[Syntax Error] line 0, col 700: Error: Expected end of string, got '('
答案 0 :(得分:4)
尝试在select语句中添加order列,然后按顺序排序。
$qb = $em->createQueryBuilder();
$qb
->select('entity', 'COALESCE(col1, col2) as orderCol')
->from('Namespace/Entity', 'entity')
->orderBy('orderCol', 'DESC')
使用IF库中的beberlei/DoctrineExtensions可能会有所帮助。使用composer安装它(或者你可以根据需要复制一个文件)和
在 config.yml
中注册函数doctrine:
orm:
entity_managers:
default:
dql:
string_functions:
IF: DoctrineExtensions\Query\Mysql\IfElse
并构建查询
$qb = $em->createQueryBuilder();
$qb
->select('entity', 'IF(col1, col1, col2) as orderCol')
->from('Namespace/Entity', 'entity')
->orderBy('orderCol', 'DESC')
另一种选择是将Native Query与纯mysql一起使用,并将结果映射到实体。