4

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

col1 | col2
5    |
2    |
     | 3
7    |
     | 1
     | 1

结果应如下所示:

col1 | col2
     | 1
     | 1
2    |
     | 3
5    |
7    |

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

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

编辑:

我像这样尝试了orderBy:

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 '(' 
4

1 回答 1

5

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

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

也许使用beberlei /DoctrineExtensions库中的IF会有所帮助。用 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 一起使用并将结果映射到实体。

于 2013-11-17T14:14:34.177 回答