我基本上有以下(我的)SQL-Query
SELECT * FROM `address`
ORDER BY ISNULL(`company`), `company` ASC, COALESCE(`parent_id`, `address_id`), `parent_id` IS NOT NULL
工作完美性
我的目标是以下排序输出
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
我正在使用Symfony 2和Doctrine。 目前我使用Doctrine查询生成器,因为OrderBy应该是我用不同方面实现的搜索的一部分(按标签搜索,按不同字段搜索“地址”......)
当我尝试将“IS NULL”或“COALESCE”添加到
时$qb->add('orderBy', ' >ORDERBY_STATEMENT< ');
或以任何其他方式使用查询构建器
编写order by语句我得到以下
[Syntax Error] line 0, col 90: Error: Expected end of string, got 'IS'
我发现Doctrine并非特定于供应商,因此无法支持所有供应商功能。
我读了一篇关于扩展Doctrines DQL函数的文章。但是已经有一个使用Doctrine Expressions的“isNull”函数,它对我来说在OrderBy中不起作用。
有人知道如何使用查询构建器实现所描述的OrderBy语句吗?
答案 0 :(得分:16)
可能会有所帮助:
$qb = $em->createQueryBuilder();
$qb->select('Entity, COALESCE(Entity.column1, Entity.column2) as columnOrder')
->from('Namespace\EntityName', 'Entity')
->addOrderBy('columnOrder', 'ASC')
->getQuery()
->execute();
答案 1 :(得分:0)
感谢&#39; s Andi Sholihin!
我只是在symfony 3下发布了一个带有函数IDENTITY()
的工作替代方案:)
$repository = $this->getDoctrine()->getRepository(Address::class);
$query = $repository->createQueryBuilder('a')
->select('a, COALESCE(IDENTITY(a.parent), a.id) as columnOrder')
->orderBy('columnOrder', 'ASC')
->addOrderBy('a.parent', 'ASC')
->getQuery();