在 Doctrine 2 中做一个 WHERE .. IN 子查询 [英] Doing a WHERE .. IN subquery in Doctrine 2
本文介绍了在 Doctrine 2 中做一个 WHERE .. IN 子查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想从具有特定商品的所有订单中选择订单商品.在 SQL 中,我会这样做:
I'd like to select order items from all orders with a specific item. In SQL I'd do it like this:
SELECT DISTINCT i.id, i.name, order.name
FROM items i
JOIN orders o ON i.order_id=o.id
WHERE o.id IN (
SELECT o2.id FROM orders o2
JOIN items i2 ON i2.order_id=o2.id AND i2.id=5
)
AND i.id != 5
ORDER BY o.orderdate DESC
LIMIT 10
我将如何使用查询构建器执行此查询?
How would I do this query with the query builder?
推荐答案
这是我尝试的方式:
/** @var DoctrineORMEntityManager $em */
$expr = $em->getExpressionBuilder();
$em->createQueryBuilder()
->select(array('DISTINCT i.id', 'i.name', 'o.name'))
->from('Item', 'i')
->join('i.order', 'o')
->where(
$expr->in(
'o.id',
$em->createQueryBuilder()
->select('o2.id')
->from('Order', 'o2')
->join('Item',
'i2',
DoctrineORMQueryExprJoin::WITH,
$expr->andX(
$expr->eq('i2.order', 'o2'),
$expr->eq('i2.id', '?1')
)
)
->getDQL()
)
)
->andWhere($expr->neq('i.id', '?2'))
->orderBy('o.orderdate', 'DESC')
->setParameter(1, 5)
->setParameter(2, 5)
;
我当然没有对此进行测试,而是对您的模型进行了一些假设.可能的问题:
I didn't test this of course, and made some assumptions about your models. Possible problems:
- 限制:这在 Doctrine 2 中有点问题,似乎查询构建器不太擅长接受限制.看看 此处,这里 和 此处.
- IN 子句通常用于数组,但我认为它可以用于子查询.
- 您可能可以使用相同的参数 ?1,而不是两个参数(因为它们的值相同),但我不确定.
总结一下,这可能第一次行不通,但肯定会让您走上正轨.请务必在事后告诉我们最终的 100% 正确答案.
Concluding, this may not work first time, but will surely put you on the right track. Do tell us the final 100% correct answer afterwards.
这篇关于在 Doctrine 2 中做一个 WHERE .. IN 子查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文