使用PHP学说ORM的复杂WHERE子句(Complex WHERE clauses using t

2019-06-24 06:22发布

我使用PHP学说ORM建立我的查询。 不过,我不能完全似乎弄清楚如何写以下WHERE使用DQL(学说查询语言)条款:

WHERE name='ABC' AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X') 
AND price > 10

我怎么可以指定括号去了?

我目前在我的PHP代码是这样的:

->where('name = ?', 'ABC')
->andWhere('category1 = ?', 'X')
->orWhere('category2 = ?', 'X')
->orWhere('category3 = ?', 'X')
->andWhere('price > ?', 10)

但是,这会产生像

WHERE name='ABC' AND category1 = 'X' OR category2 = 'X' OR category3 = 'X' 
AND price > 10

其中,由于操作的顺序,不返回预期的结果。

此外,有没有“在哪里”,“andWhere”和“addWhere”方法之间的区别?

更新 OK,就好像你不能这样做使用DQL复杂的查询,所以我一直在试图手动编写SQL和使用andWhere()方法来添加。 但是,我使用WHERE..IN和学说似乎剥出我的圆括号:

$q->andWhere("(category1 IN $subcategory_in_clause
            OR category2 IN $subcategory_in_clause 
            OR category3 IN $subcategory_in_clause)");

Answer 1:

从我的经验,每一个复杂的where功能括号内分组(我使用学说1.2.1)。

$q->where('name = ?', 'ABC')
  ->andWhere('category1 = ? OR category2 = ? OR category3 = ?', array('X', 'X', 'X'))
  ->andWhere('price < ?', 10)

产生以下SQL:

WHERE name = 'ABC' 
  AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X')
  AND price < 10


Answer 2:

这样做的正确的方式,可以发现学说2 -查询生成器条件查询...如果语句? 由@Jekis指出。 下面是如何使用表达式生成器来解决这个像@ anushr的例子。

$qb->where($qb->expr()->eq('name', ':name'))
  ->andWhere(
    $qb->expr()->orX(
      $qb->expr()->eq('category1', ':category1'),
      $qb->expr()->eq('category2', ':category2'),
      $qb->expr()->eq('category3', ':category3')
  )
  ->andWhere($qb->expr()->lt('price', ':price')
  ->setParameter('name', 'ABC')
  ->setParameter('category1', 'X')
  ->setParameter('category2', 'X')
  ->setParameter('category3', 'X')
  ->setParameter('price', 10);


Answer 3:

因为它似乎就像你不能使用DQL做复杂的查询,我写了下面的SQL传递给andWhere()方法:

$q->andWhere("(category1 IN $subcategory_in_clause
OR category2 IN $subcategory_in_clause 
OR category3 IN $subcategory_in_clause) AND TRUE");

请注意“及真确”,黑客攻击,这样分析器就不能忽视外括号。



Answer 4:

andWhere可以概括为:
先前添加的条件(S)意识到WHERE语句

您可以放心地使用其中 andWhere就地。 (它引入了一个非常小的开销,这是在第二个列表项下面的说明。)

andWhere的实现是:(1.2.3学说)

public function andWhere($where, $params = array())
{
    if (is_array($params)) {
        $this->_params['where'] = array_merge($this->_params['where'], $params);
    } else {
        $this->_params['where'][] = $params;
    }

    if ($this->_hasDqlQueryPart('where')) {
        $this->_addDqlQueryPart('where', 'AND', true);
    }

    return $this->_addDqlQueryPart('where', $where, true);
}

这可以理解为,

  1. 工艺参数
  2. 追加语句来查询的,其中一部分, 如果其它地方之前加入声明
  3. 附加条件


Answer 5:

至于区别在哪里,andwhere和addwhere,我不相信这是从我最后一次读取源的显著差异的区别。 我建议你阅读学说源,但是。 这真的很简单,并有助于在文档中的孔填充(有很多)。 至于复杂,语句,我这个不知道自己,但还没有一个需要它。



Answer 6:

根据我的经验,我有时可见之间的差异:

$q->andWhere("(category1 IN $subcategory_in_clause
            OR category2 IN $subcategory_in_clause 
            OR category3 IN $subcategory_in_clause)");

$q->andWhere("(category1 IN $subcategory_in_clause OR category2 IN $subcategory_in_clause OR category3 IN $subcategory_in_clause)");

第一条语句写在三线,第二,只有一个。 我不相信它,但是是有区别的!



Answer 7:

$q->andWhere("category1 IN ( $subcategory_in_clause )
              OR category2 IN ( $subcategory_in_clause )
              OR category3 IN ( $subcategory_in_clause )");

你会这么好心来试试这个变型,不知道它的工作原理,但值得一试



文章来源: Complex WHERE clauses using the PHP Doctrine ORM