orderBy 几列 - Doctrine QueryBuilder

Rob*_*bin 4 sql doctrine symfony doctrine-orm

我想在几个列上使用 orderBY,但它们应该像一列一样。该表看起来像这样:

col1 | col2
5    |
2    |
     | 3
7    |
     | 1
     | 1
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的:

col1 | col2
     | 1
     | 1
2    |
     | 3
5    |
7    |
Run Code Online (Sandbox Code Playgroud)

如果我们要使用原始 SQL,就会有方法,比如使用COALESCE.

但是如何在 Doctrine QueryBuilder 中实现这一点呢?

编辑:

我像这样尝试了 orderBy:

qb->orderBy("COALESCE(col1, col2)", "DESC");
Run Code Online (Sandbox Code Playgroud)

而像这样

qb->add("orderBy", "COALESCE(col1, col2) DESC");
Run Code Online (Sandbox Code Playgroud)

但是两次我都被抛出了以下错误:

[Syntax Error] line 0, col 700: Error: Expected end of string, got '(' 
Run Code Online (Sandbox Code Playgroud)

Ale*_* B. 5

尝试在 select 语句中添加 order 列,然后按它排序。

$qb = $em->createQueryBuilder();
$qb
    ->select('entity', 'COALESCE(col1, col2) as orderCol')
    ->from('Namespace/Entity', 'entity')
    ->orderBy('orderCol', 'DESC')
Run Code Online (Sandbox Code Playgroud)

也许它可以帮助使用IFbeberlei / DoctrineExtensions库。使用 composer 安装它(或者如果你愿意,你可以只复制一个文件)和

config.yml 中注册函数

doctrine:
    orm:
      entity_managers:
        default:
          dql:
            string_functions:
              IF: DoctrineExtensions\Query\Mysql\IfElse 
Run Code Online (Sandbox Code Playgroud)

并建立一个查询

$qb = $em->createQueryBuilder();
$qb
    ->select('entity', 'IF(col1, col1, col2) as orderCol')
    ->from('Namespace/Entity', 'entity')
    ->orderBy('orderCol', 'DESC')
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用带有纯 mysql 的Native Query并将结果映射到实体。

  • 我可以确认@forgottenbas 的解决方案将起作用,因为我几天前遇到了类似的情况。此外,我还将包含`HIDDEN`关键字以保留干净的结果集结构,但这绝不是强制性的:`COALESCE(col1, col2) as HIDDEN orderCol` (8认同)