如何在Doctrine中使用andWhere和orhere?

时间:2012-02-01 11:37:54

标签: php sql doctrine

WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2)

我如何在Doctrine中做到这一点?

$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中......?

4 个答案:

答案 0 :(得分:100)

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

答案 1 :(得分:64)

以下是那些条件较复杂且使用Doctrine 2. * QueryBuilder的人的例子:

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

这些是Czechnology答案中提到的表达方式。

答案 2 :(得分:11)

为什么不

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

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

答案 3 :(得分:5)

这里缺少一件事:如果你想要将不同数量的元素组合成类似

的元素
lower.groupBy(t => t) map ( (x,y) => x -> y.length)

并且不想自己组装DQL-String,你可以使用上面提到的WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%')

orX