小编典典

使用PHP Doctrine ORM的复杂WHERE子句

sql

我正在使用PHP Doctrine ORM来构建查询。但是,我似乎不太清楚如何使用DQL(Doctrine查询语言)编写以下WHERE子句:

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

由于操作顺序的原因,该操作不会返回预期的结果。

另外,“ where”,“ andWhere”和“ addWhere”方法之间是否有区别?

更新 好的,看来您无法使用DQL进行复杂的查询,因此我一直在尝试手动编写SQL并使用andWhere()方法添加它。但是,我使用的是WHERE..IN,Doctrine似乎在剥掉我的括号:

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

阅读 237

收藏
2021-04-15

共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
2021-04-15