原则 IF 语句
Doctrine IF Statement
我在 Doctrine 中有以下代码:
return $this->createQueryBuilder('t')
->where('t.status LIKE :status')
->orderBy('t.createdAt', 'DESC')
->setParameter('status', $status)
->setMaxResults($limit)
->getQuery()
->getResult()
;
然而,我想要构建的真正 SQL 查询是这样的:
SELECT t.*,
IF(deleted = 1, 4, status) AS status
FROM trm t
WHERE status = 3 ORDER BY created_at DESC;
如果 'deleted' 列为真,则实质上将状态列替换为 = 4。
如何在上面的学说查询中重新创建它?
我已经尝试研究 ->expr()->eq 但我找不到任何简单的示例可以遵循。我什至不确定它们是否是我需要使用的。
你需要 DoctrineExtnesions ( https://github.com/beberlei/DoctrineExtensions )
orm:
..
entity_managers:
....
dql:
....
string_functions:
IF: DoctrineExtensions\Query\Mysql\IfElse
但以这种方式修改实体并不是一个好的做法。
Doctrine 默认没有 IF
表达式支持。而是支持 CASE
表达式,可以将其转换为:CASE t.deleted WHEN 1 THEN 4 ELSE t.status END
转换为 ORM QueryBuilder 的原始查询将是:
$this->createQueryBuilder('t')
->addSelect('CASE t.deleted WHEN 1 THEN 4 ELSE t.status END AS status')
->where('t.status LIKE :status')
->orderBy('t.createdAt', 'DESC')
->setParameter('status', $status)
->setMaxResults($limit)
->getQuery()
->getResult();
但是,这不会修改发送到实体的值,而是生成一个嵌套数组结果,其中 status
值被分隔开。
array
array
[0] => Entity (Object)
['status'] => 4
array
[0] => Entity (Object)
['status'] => 4
// ...
我在 Doctrine 中有以下代码:
return $this->createQueryBuilder('t')
->where('t.status LIKE :status')
->orderBy('t.createdAt', 'DESC')
->setParameter('status', $status)
->setMaxResults($limit)
->getQuery()
->getResult()
;
然而,我想要构建的真正 SQL 查询是这样的:
SELECT t.*,
IF(deleted = 1, 4, status) AS status
FROM trm t
WHERE status = 3 ORDER BY created_at DESC;
如果 'deleted' 列为真,则实质上将状态列替换为 = 4。
如何在上面的学说查询中重新创建它?
我已经尝试研究 ->expr()->eq 但我找不到任何简单的示例可以遵循。我什至不确定它们是否是我需要使用的。
你需要 DoctrineExtnesions ( https://github.com/beberlei/DoctrineExtensions )
orm:
..
entity_managers:
....
dql:
....
string_functions:
IF: DoctrineExtensions\Query\Mysql\IfElse
但以这种方式修改实体并不是一个好的做法。
Doctrine 默认没有 IF
表达式支持。而是支持 CASE
表达式,可以将其转换为:CASE t.deleted WHEN 1 THEN 4 ELSE t.status END
转换为 ORM QueryBuilder 的原始查询将是:
$this->createQueryBuilder('t')
->addSelect('CASE t.deleted WHEN 1 THEN 4 ELSE t.status END AS status')
->where('t.status LIKE :status')
->orderBy('t.createdAt', 'DESC')
->setParameter('status', $status)
->setMaxResults($limit)
->getQuery()
->getResult();
但是,这不会修改发送到实体的值,而是生成一个嵌套数组结果,其中 status
值被分隔开。
array
array
[0] => Entity (Object)
['status'] => 4
array
[0] => Entity (Object)
['status'] => 4
// ...