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)
尝试在 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)
也许它可以帮助使用IF从beberlei / 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并将结果映射到实体。
| 归档时间: |
|
| 查看次数: |
2779 次 |
| 最近记录: |