如何分组更多,在哪里,或教义中的哪里


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 的示例。
对于经验。 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()
        ;
}

如何在教义2中使用我的选择来创建Query Builder

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

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

// In this example I'll be assuming that 'dg' is an entity
// and that 'a', 'b' and 'c' are its attributes
// since, remember, Doctrine is designed specifically for using entities
// and make abstraction of the whole table model in your database
// First we'll create your QueryBuilder instance $qb
$qb = $this->createQueryBuilder('dg');
// Then we add our statements to the QueryBuilder instance
$qb
    ->where($qb->eq('dg.a', 1))
    ->andWhere($qb->expr()->orX(
        $qb->expr()->gt('dg.a', 1),
        $qb->expr()->eq('dg.b', 2)
    ))
    ->andWhere($qb->expr()->orX(
        $qb->expr()->gt('dg.a', 1),
        $qb->expr()->eq('dg.c', 3)
    ))
;
// Now you can use the QueryBuilder instance to, for instance, 
// have it do getResult (which in this case will return an array of 'dg' entities)
return $qb->getQuery()->getResult();
你也可以将 orX(( 和 andX(('s 放入其他 orX(( 和 andX((

中,并且可以在 andX(( 和 orX(( 中添加任意数量的条件来创建非常复杂的查询。

玩得开心:)

引用教程中

告诉我关于这个主题的明智之言:

因此,即使有一个 orWhere(( 函数,也不要使用它 - 它可能会导致 WTF 时刻。

一般来说,即使

有选项,您也不会被迫使用它们。在复杂 where 子句的情况下,很难正确,控制括号的位置、可读性等。

当我在这一点上时,我只是用正确的括号等放下 andwhere 就像你的例子一样:

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

虽然这可能不是"正确的方法"(见@TomDeRoo的答案(,但至少我可以读懂发生了什么。只要知道您不必总是使用工具提供的所有内容。

当然可以自由选择您喜欢的任何解决方案。

相关内容

  • 没有找到相关文章

最新更新