Doctrine中的简单IF测试语句

She*_*erd 5 mysql doctrine

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

Expected known function, got 'IF'
Run Code Online (Sandbox Code Playgroud)

使用IF执行此查询时:

$qb->select("c.id, IF(c.type_id LIKE 9, c.name, c.lastname) as name")
Run Code Online (Sandbox Code Playgroud)

它在纯SQL中重写时工作正常.任何解决方法?

Abh*_*rty 13

是的if,不支持在教义陈述你可以将其转换为case when

IF(c.type_id LIKE 9, c.name, c.lastname) as name
Run Code Online (Sandbox Code Playgroud)

case when c.type_id = 9 then c.name else c.lastname end as name
Run Code Online (Sandbox Code Playgroud)

更新: 从评论中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)
Run Code Online (Sandbox Code Playgroud)


voo*_*417 8

:对于原则 2

认为在这种情况下最好使用一些额外的功能(而不是试图“规避”他们的功能)。例如, beberlei (github) 的 DoctrineExtensionsDoctrine 2是 添加几乎所有必需的(盒子不支持的)内容的优秀解决方案。有了它,就可以像OP的情况一样直接使用-语句:IF

(“Symfony-example”)例如在您的config.xml添加行中:

orm:
    ..
    entity_managers:
            ....
            dql:
                ....
                string_functions:
                    IF: DoctrineExtensions\Query\Mysql\IfElse
Run Code Online (Sandbox Code Playgroud)

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

 $qb->select("..IF(condition, true-state, false-state)...")
Run Code Online (Sandbox Code Playgroud)