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 重写时工作正常。有什么解决办法吗?
是的
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)
注:适用于学说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)...")