Doctrine OrWhere声明原则1
使用单个andWhere语句解决了该问题Doctrine OrWhere声明原则1,doctrine,Doctrine,使用单个andWhere语句解决了该问题 $query->andWhere("(SELECT COUNT(*) as result FROM EvaluateurCandidature ec4 WHERE ec.candidature_id_ca = ec4.candidature_id_ca AND ec4.role_evaluateur = 'rapporteur' AND ec4.statut_evaluation = ? OR ec.candidature_id_ca = ec4.
$query->andWhere("(SELECT COUNT(*) as result FROM EvaluateurCandidature ec4 WHERE ec.candidature_id_ca = ec4.candidature_id_ca AND ec4.role_evaluateur = 'rapporteur' AND ec4.statut_evaluation = ? OR ec.candidature_id_ca = ec4.candidature_id_ca AND ec4.role_evaluateur = 'rapporteur' AND ec4.statut_evaluation = ? ) >= '2'" , array('en cours' , 'terminée'));
我尝试在查询中使用OrWhere语句,但在执行此操作时,返回的对象不依赖于c.id\u ap
有人知道我如何用orWhere在一行中实现查询吗?我试过了,但没有成功
$query->AND WHERE选择COUNT*作为评估条件ec2的结果,其中ec.candidate\u id\u ca=ec2.candidate\u id\u ca和ec2.role\u evaluateur='evaluateur'和ec2.statute\u evaluation='en cours'或ec2.statute\u evaluation='termée'>='2'
我只需要检查ec2中是否有两个以上的结果。statut_evaluation='en cours'或'termée'
下面是实际查询:
$query = Doctrine_Query::create()
->from('Candidature c')
->leftJoin('c.EvaluateurCandidature ec')
->where('c.id_stca = 5');
$query->andWhere('c.id_ap=?', array($this->id_ap));
$query->andWhere("(SELECT COUNT(*) as result FROM EvaluateurCandidature ec2 WHERE ec.candidature_id_ca = ec2.candidature_id_ca AND ec2.role_evaluateur = 'evaluateur' AND ec2.statut_evaluation = 'en cours') >= '2'");
$query->orWhere("(SELECT COUNT(*) as result FROM EvaluateurCandidature ec3 WHERE ec.candidature_id_ca = ec3.candidature_id_ca AND ec3.role_evaluateur = 'evaluateur' AND ec3.statut_evaluation = 'terminée') >= '2'");
对于您的问题,您需要将OR条件分组以避免此类问题,这是因为运算符优先,并且在OR之前绑定,因此您的查询的计算结果为
c.id_stca = some AND (SELECT ...) >= 2 OR (SELECT ...) >= 2
应将其分组为
c.id_stca = some AND ( (SELECT ...) >= 2 OR (SELECT ...) >= 2 )
对于原则1,我想n查询生成器您可以将其编写为
$query = Doctrine_Query::create()
->from('Candidature c')
->leftJoin('c.EvaluateurCandidature ec')
->where('c.id_stca = 5')
->andWhere('c.id_ap=?', array($this->id_ap))
->andWhere(
$query->expr()->orX(
$query->andWhere("(SELECT COUNT(*) as result
FROM EvaluateurCandidature ec2
WHERE ec.candidature_id_ca = ec2.candidature_id_ca
AND ec2.role_evaluateur = 'evaluateur'
AND ec2.statut_evaluation = 'en cours') >= '2'"),
$query->andWhere("(SELECT COUNT(*) as result
FROM EvaluateurCandidature ec3
WHERE ec.candidature_id_ca = ec3.candidature_id_ca
AND ec3.role_evaluateur = 'evaluateur'
AND ec3.statut_evaluation = 'terminée') >= '2'")
)
);