使用PHP Doctrine ORM的复杂WHERE子句

Wic*_*wok 38 php mysql doctrine dql

我正在使用PHP Doctrine ORM来构建我的查询.但是,我似乎无法想象如何使用DQL(Doctrine查询语言)编写以下WHERE子句:

WHERE name='ABC' AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X') 
AND price > 10
Run Code Online (Sandbox Code Playgroud)

如何指定括号的位置?

我目前在PHP代码中拥有的是:

->where('name = ?', 'ABC')
->andWhere('category1 = ?', 'X')
->orWhere('category2 = ?', 'X')
->orWhere('category3 = ?', 'X')
->andWhere('price > ?', 10)
Run Code Online (Sandbox Code Playgroud)

但这会产生类似的东西

WHERE name='ABC' AND category1 = 'X' OR category2 = 'X' OR category3 = 'X' 
AND price > 10
Run Code Online (Sandbox Code Playgroud)

由于操作顺序,它不会返回预期的结果.

另外,"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)");
Run Code Online (Sandbox Code Playgroud)

anu*_*shr 68

根据我的经验,每个复杂的where函数都在括号内分组(我使用的是Doctrine 1.2.1).

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

生成以下SQL:

WHERE name = 'ABC' 
  AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X')
  AND price < 10
Run Code Online (Sandbox Code Playgroud)


Dav*_*cum 16

这样做的正确方法可以在doctrine 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);
Run Code Online (Sandbox Code Playgroud)

  • 这正是我讨厌Doctrine的原因.这是不可能阅读和理解的. (6认同)