在 Doctrine 2 中做一个 WHERE .. IN 子查询 [英] Doing a WHERE .. IN subquery in Doctrine 2

查看:23
本文介绍了在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆