如何分组更多和哪​​些,或者在Doctrine中

时间:2017-06-15 14:20:59

标签: php sql symfony doctrine-orm

SELECT * FROM dg
WHERE 
     ( a < 1 AND b > 1)
  OR ( a > 1 AND ( 
                     (c = 3 AND B < 2) 
                  or (c = 4 AND B < 5 ))
     )

我不确定如何正确分组更多andWhereorWhere。我找到了一个更多AND组的例子,但没有找到OR的例子。
对于exp。 WHERE a=1 AND (a>1 Or b=2) AND (a>1 OR c=2)工作查询是:

public function myQuery()
{
    return $this->createQueryBuilder( 'dg' )
                ->where("a = 1")
                ->andWhere("a > 1 OR b = 2")
                ->andWhere("a > 1 OR c = 3")
                ->getQuery()
                ->getResult()
        ;
}

如何在Doctrine2中使用我的SELECT来创建Query Builder

2 个答案:

答案 0 :(得分:7)

对于or /和等的分组和层次结构,您可以使用querybuilder的and方法链接到or->expr()->andX()。 {1}}分别在您的QueryBuilder实例上。您可以在此处查看更多信息:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class

基本上你会得到类似下面的内容来翻译你的第二个陈述:

->orX()

您也可以将orX()和andX()放入其他orX()和andX()中,并且可以在andX()和orX中添加任意数量的条件( ),创建非常复杂的查询。

玩得开心:)

答案 1 :(得分:1)

引用教程,告诉我关于这个主题的明智的话:

  

所以即使有一个orWhere()函数,也不要使用它 - 它会导致WTF时刻。

一般情况下,即使选项存在,您也不会被迫使用它们。在复杂的情况下,条款难以理解,控制括号的去向,可读性等。

当我在这一点上时,我只是放下了一个带有正确括号的“和”,就像你的例子一样:

->addWhere("
    (a < 1 AND b > 1)
    OR (
        (a > 1) AND (
            (c = 3 AND B < 2) OR
            (c = 4 AND B < 5)
        )
    )
");

虽然这可能不是正确的方法&#39; (参见@TomDeRoo的回答)但至少我可以读到最新情况。只要知道你不必总是使用工具提供的所有东西。

你当然可以自由选择你想要的任何解决方案。