如何在 doctrine 的 queryBuilder 中做 WHERE CASE WHEN

How to do a WHERE CASE WHEN in doctrine's queryBuilder

我使用查询生成器有以下功能:

    public function showForJustWhoCanSee() {
        $nextToSign = $this->em->createQueryBuilder();
        $nextToSign->select('u')
            ->from('HospitalApi\Entity\EletronicDocumentSignature', 's')
            ->innerJoin('HospitalApi\Entity\User', 'u', 'WITH', 's.user = u')
            ->where('s._document = :documentId')
            ->setParameter('documentId', 'ed.id')
            ->andWhere('s.signed = 0')
            ->setMaxResults('1')
            ->orderBy('s.order', 'ASC');


        $subquery = $this->em->createQueryBuilder();
        $subquery->select('userSignature')
            ->from('HospitalApi\Entity\EletronicDocumentSignature', 'signature')
            ->innerJoin('HospitalApi\Entity\User', 'userSignature', 'WITH', 'userSignature = signature.user')
            //->where('signature.signed = 0')
            ->groupBy('signature._document')
            ->orderBy('signature.order', 'ASC');

        $select = $this->em->createQueryBuilder();
        $select->select('ed')
            ->from($this->getEntityPath(), 'ed')
            ->innerJoin("HospitalApi\Entity\User", "u", "with", "ed.user = u")
            ->leftJoin("HospitalApi\Entity\EletronicDocumentSignature", 'eds', 'WITH', 'eds._document = ed')
            ->leftJoin("eds.user", 'us', 'WITH', 'u = :user OR us = :user')
            ->where( $select->expr()->eq( 'us', $select->expr()->any( $subquery->getDQL() )) )
            //   ->Need a andWhere here<-
            ->orwhere('u = :user')
            ->setParameter( 'user', $this->getSession() )
            ->andWhere('ed.c_removed = 0');
        return $select;
    }

我想知道如何向执行以下操作的 $select 查询添加 andWhere() 子句:

CASE WHEN 'ed.user' = ':user' THEN $nextToSign = ':user'

我试过了

->andWhere( 'CASE WHEN', $select->expr()->neq('ed.user', ':user'), 'THEN', '$nextToSign = :user' )
->andWhere( 'CASE', 'WHEN', $select->expr()->neq('ed.user', ':user'), 'THEN', $nextToSign = ':user' )
->andWhere( 'CASE', 'WHEN', $select->expr()->neq('ed.user', ':user'), 'THEN', $select->expr()->eq($nextToSign, ':user') )
->andWhere( "CASE", "WHEN", $select->expr()->neq("ed.user", ":user"), "THEN", $select->expr()->eq(":user", $nextToSign ), "END" )

和其他一些变体

None 这些作品。有没有办法使用查询生成器进行此类查询?

您需要在语句末尾添加 END

请参考 EBNF notation 将 case 语句写入 Doctrine 文档以获得准确的语法规范。

所以您的代码可能需要如下所示:

->andWhere('CASE WHEN ed.user != :user THEN <expr> END')

我不确定您的 $select->expr()->eq($nextToSign, ':user') 语句实际上意味着什么,请记住您的代码示例表明 $nextToSign 是查询生成器。因此,我已将您声明的这一部分替换为 <expr>