orderBy几个列 - Doctrine QueryBuilder

时间:2013-11-13 11:17:40

标签: sql symfony doctrine-orm doctrine

我想在几个列上使用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 '(' 

1 个答案:

答案 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一起使用,并将结果映射到实体。