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)
| 归档时间: |
|
| 查看次数: |
28871 次 |
| 最近记录: |