복붙노트

[SQL] 교리 2의 .. IN 하위 쿼리를 수행

SQL

교리 2의 .. IN 하위 쿼리를 수행

나는 특정 항목과 모든 주문에서 주문 항목을 선택하고 싶습니다. SQL에서 나는 이런 식으로 그것을 할 것입니다 :

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

어떻게 쿼리 빌더이 쿼리를 할 것인가?

해결법

  1. ==============================

    1.이것은 내가 그것을 시도 할 방법입니다

    이것은 내가 그것을 시도 할 방법입니다

    /** @var Doctrine\ORM\EntityManager $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', 
                          \Doctrine\ORM\Query\Expr\Join::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)
       ;
    

    나는 물론이 테스트하고 모델에 대한 몇 가지 가정을하지 않았다. 가능한 문제 :

    결론이는 처음 작동하지 않을 수 있습니다, 그러나 확실하게 바른 길에 당신을 둘 것입니다. 이후 우리에게 마지막 100 % 정답을 말하지 마십시오.

  2. ==============================

    2.그냥 마지막 코멘트 피하기 혼란은 clang1234에 의해 기록했다.

    그냥 마지막 코멘트 피하기 혼란은 clang1234에 의해 기록했다.

    DQL 쿼리 예는 정말 작동합니다. 그것은 사실 그 expr->에서 ()이 케이스 DQL 문자열, 배열에 두 번째 매개 변수를 캐스팅합니다. 그것은 무엇을, 그냥 첫 번째 요소로 DQL 쿼리 문자열 배열을 만들 수 있습니다. 즉하여 EXPR \ Func을은을 위해 배열을 기다리고 정확히입니다. 그것은 좀 더 깊이 교리 2 코드에서 DQL 쿼리 문자열 배열 요소가 제대로 관리 될 것입니다. () (어레이는 IN에 내파 얻을 자세한 내용 DBAL / 플랫폼 / AbstractPlatform.php 방법 getInExpression 참조)

  3. from https://stackoverflow.com/questions/6637506/doing-a-where-in-subquery-in-doctrine-2 by cc-by-sa and MIT license