如何在 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>
。
我使用查询生成器有以下功能:
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>
。