在OrderBy Doctrine Querybuilder中使用IS NULL和COALESCE

nix*_*chu 8 mysql doctrine sql-order-by symfony doctrine-orm

我基本上有以下(我的)SQL查询

SELECT * FROM `address`
ORDER BY ISNULL(`company`), `company` ASC, COALESCE(`parent_id`, `address_id`), `parent_id` IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

这项工作完美无缺

我的目标是以下排序输出

ID| PARENT_ID | COMPANY | NAME
1 | NULL      | A       | NULL
2 | 1         | A.A     | NULL
3 | 1         | A.B     | NULL
4 | NULL      | B       | NULL
5 | NULL      | C       | NULL
6 | NULL      | D       | NULL
7 | 6         | D.A     | NULL
8 | NULL      | NULL    | A
Run Code Online (Sandbox Code Playgroud)

我正在使用Symfony 2和Doctrine.目前我使用Doctrine查询生成器,因为OrderBy应该是我用不同方面实现的搜索的一部分(按标签搜索,按不同字段"地址"搜索...)

当我尝试添加"IS NULL"或"COALESCE"时

$qb->add('orderBy', ' >ORDERBY_STATEMENT< ');
Run Code Online (Sandbox Code Playgroud)

或者以任何其他方式使用查询构建器编写order by语句

我得到以下内容

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

我发现Doctrine不是特定于供应商的,因此无法支持所有供应商功能.

我读了一篇关于扩展Doctrines DQL函数的文章.但是已经存在一个使用Doctrine Expressions的"isNull"函数,它对我来说在OrderBy中不起作用.

有人知道如何使用查询构建器实现描述的OrderBy语句吗?

小智 16

可能这可以帮助:

$qb = $em->createQueryBuilder();
$qb->select('Entity, COALESCE(Entity.column1, Entity.column2) as columnOrder')
   ->from('Namespace\EntityName', 'Entity')
   ->addOrderBy('columnOrder', 'ASC')
   ->getQuery()
   ->execute();
Run Code Online (Sandbox Code Playgroud)