在教义中如何使用andWhere and orWhere?


69
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")

但是我该怎么做呢?在Propel中是函数getNewCriterion,在Doctrine中是函数...?

Answers:


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

11
那为什么不把所有事情都放在where()电话里呢?
MatBailie

3
我不会对这种语法感到满意...如果您尝试迁移到某种病态的“ SQL”,OR将其替换为||...该怎么b = ? OR b = ?

@Dems是的,肯定有可能。这样,该方法更快。
马林

5
@维克多:学说处理了这一点。这实际上是DQL,而不是SQL-Doctrine QL,它转换为对您透明的有效供应商特定的SQL。另外:andWhere("b=? OR b=?", array(1, 2))
梅林

1
我认为这应该是$ q-> where(“ a = 1”)-> andWhere(“(b = 1 OR b = 2)”)-> andWhere(“(c = 2 OR c = 2)”);
卡林·布拉加

83

这是针对那些条件更复杂并使用Doctrine 2. *的用户的示例QueryBuilder

$qb->where('o.foo = 1')
   ->andWhere($qb->expr()->orX(
      $qb->expr()->eq('o.bar', 1),
      $qb->expr()->eq('o.bar', 2)
   ))
  ;

这些是捷克学答案中提到的表达方式。


13

这里缺少一件事:如果您想将不同数量的元素放在一起,例如

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

不想自己组装DQL-String,可以orX像上面这样使用上面提到的:

$patterns = ['abc', 'def'];
$orStatements = $qb->expr()->orX();
foreach ($patterns as $pattern) {
    $orStatements->add(
        $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%'))
    );
}
$qb->andWhere($orStatements);

12

为什么不只是

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

编辑:您还可以使用Expr类(Doctrine2)。


问题是针对学说1.2的,您链接的文档是针对2.0的。
Maerlyn '02

4
@Maerlyn,好吧,这个问题没有doctrine-1.2标签,所以我不能确定用户是哪个标签-在这种情况下,我隐式地期望最新的标签。
捷克学

我的错误是,不知道doctrine2的查询生成器中有andWhere和orWhere。
Maerlyn '02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.