Php 如何在学说中使用andWhere和orWhere?

Php 如何在学说中使用andWhere和orWhere?,php,sql,doctrine,Php,Sql,Doctrine,我怎样才能在教义中做到这一点 WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2) 这不正确。。。应该是: $q->where("a = 1"); $q->andWhere("b = 1") $q->orWhere("b = 2") $q->andWhere("c = 1") $q->orWhere("d = 2") 但是我怎样才能做到呢?在推进中,功能是获得新标准,而在条令中…?为什么不 $q->wh

我怎样才能在教义中做到这一点

WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2)
这不正确。。。应该是:

$q->where("a = 1");
$q->andWhere("b = 1")
$q->orWhere("b = 2")
$q->andWhere("c = 1")
$q->orWhere("d = 2")
但是我怎样才能做到呢?在推进中,功能是获得新标准,而在条令中…?

为什么不

$q->where("a = 1");
$q->andWhere("b = 1")
   $q->orWhere("b = 2")
$q->andWhere("c = 1")
   $q->orWhere("d = 2")
$q->where("a = 1")
  ->andWhere("b = 1 OR b = 2")
  ->andWhere("c = 2 OR c = 2")
  ;

编辑:您也可以使用(Doctrine2)。

以下是一个例子,适用于那些有更复杂情况并使用Doctrine2.*的患者:


这些都是Czetechnology答案中提到的表达式。

这里缺少一件事:如果你有不同数量的元素,你想把它们组合在一起,比如

$qb->where('o.foo = 1')
   ->andWhere($qb->expr()->orX(
      $qb->expr()->eq('o.bar', 1),
      $qb->expr()->eq('o.bar', 2)
   ))
  ;
如果您不想自己组装DQL字符串,可以像这样使用上面提到的
orX

WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%')

那么为什么不把它全部放在
where()
调用中呢?我对这种语法不满意。。。如果您尝试迁移到某种病态的“SQL”,其中
将被
|
取代,该怎么办。。。当您需要使用
b=,这是如何工作的?或者b=?
@Dems是的,这当然是可能的。这个方法更快,不过。@Vyktor:doctrine处理这个问题。这实际上是DQL,而不是转换为对您透明的有效供应商特定SQL的SQL-SQL。另外:
andWhere(“b=?或b=?”,数组(1,2))
。我认为这应该是$q->where(“a=1”)->和where((b=1或b=2)”)->和where((c=2或c=2)”;问题是针对doctrine 1.2的,你链接的文档是针对2.0的。@Maerlyn,这个问题没有
doctrine-1.2
标签,所以我不能确定用户指的是哪一个-在这种情况下,我隐含地希望是最新的。我的错误是,不知道doctrine2的查询生成器中有andWhere和WHERE。
WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%')
$patterns = ['abc', 'def'];
$orStatements = $qb->expr()->orX();
foreach ($patterns as $pattern) {
    $orStatements->add(
        $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%'))
    );
}
$qb->andWhere($orStatements);