原则 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

    // ...