Doctrine 中的简单 IF 测试语句

问题描述 投票:0回答:2

Doctrine 支持 IF 语句吗?我收到以下错误:

Expected known function, got 'IF'

使用 IF 执行此查询时:

$qb->select("c.id, IF(c.type_id LIKE 9, c.name, c.lastname) as name")

用纯 SQL 重写时工作正常。有什么解决办法吗?

mysql doctrine
2个回答
28
投票

是的

if
不支持学说中的陈述,您可以将其转换为
case when

IF(c.type_id LIKE 9, c.name, c.lastname) as name

case when c.type_id = 9 then c.name else c.lastname end as name

更新: 从评论来看,

concat
功能在
case-when

中是允许的

答案是肯定的,非常允许。这是一个例子

mysql> select * from timesheets ;
+-----------+-------+----------+
| client_id | hours | category |
+-----------+-------+----------+
|         1 |  1.50 | onsite   |
|         1 |  1.50 | onsite   |
|         1 |  1.00 | remote   |
|         2 |  1.50 | remote   |
+-----------+-------+----------+
4 rows in set (0.00 sec)

mysql> select 
case when category = 'onsite' then concat('ON',' ',hours) else hours
end as dd from timesheets ;
+---------+
| dd      |
+---------+
| ON 1.50 |
| ON 1.50 |
| 1.00    |
| 1.50    |
+---------+
4 rows in set (0.00 sec)

9
投票

:适用于学说2

认为在这种情况下最好使用一些额外的功能(不要试图“规避”他们的功能)。例如。为

Doctrine 2
添加几乎所有必需的(不支持开箱即用)内容的优秀解决方案是 DoctrineExtensions by beberlei (github)。有了它,就可以直接使用
IF
语句,就像 OP 的情况一样:

("Symfony-example") 例如在你的

config.xml
添加行:

orm:
    ..
    entity_managers:
            ....
            dql:
                ....
                string_functions:
                    IF: DoctrineExtensions\Query\Mysql\IfElse

然后你可以在任何地方使用它,例如:

 $qb->select("..IF(condition, true-state, false-state)...")
© www.soinside.com 2019 - 2024. All rights reserved.