使用 PHP 原则 ORM 的复杂 WHERE 子句

2022-08-30 11:49:33

我正在使用PHP Doctrine ORM来构建我的查询。但是,我似乎不太清楚如何使用DQL(Doctrine Query Language)编写以下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和教义似乎正在去掉我括起来的括号:

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

答案 1

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

$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

答案 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);

推荐