Nice programing

교리 2에서 WHERE .. IN 하위 쿼리 수행

nicepro 2020. 12. 29. 08:28
반응형

교리 2에서 WHERE .. 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

쿼리 작성기로이 쿼리를 어떻게 수행합니까?


이것이 내가 그것을 시도하는 방법입니다.

/** @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)
   ;

물론 이것을 테스트하지 않았고 모델에 대해 몇 가지 가정을했습니다. 가능한 문제 :

  • 한계 : 이것은 Doctrine 2에서 다소 문제가되었습니다. 쿼리 작성기가 한계를 받아들이는 데 그다지 좋지 않은 것 같습니다. 살펴 마십시오 여기 , 여기여기 .
  • IN 절은 일반적으로 배열과 함께 사용되지만 하위 쿼리와 함께 작동한다고 생각합니다.
  • 두 개의 매개 변수 대신에 동일한 매개 변수? 1을 사용할 수 있지만 (동일한 값이기 때문에) 확실하지 않습니다.

결론적으로, 이것은 처음에는 작동하지 않을 수도 있지만 확실히 올바른 방향으로 나아가게 할 것입니다. 나중에 최종 100 % 정답을 알려주세요.


clang1234가 게시 한 마지막 댓글의 혼동을 피하기 위해.

dql 쿼리 예제가 실제로 작동합니다. The expr-> in ()이 두 번째 매개 변수를 배열,이 경우 dql 문자열로 캐스팅하는 것은 사실입니다. 그것이하는 일은 dql 쿼리 문자열을 첫 번째 요소로 사용하여 배열을 만듭니다. 이것이 바로 Expr \ Func가 기다리고있는 배열입니다. dql 쿼리 문자열 배열 요소가 올바르게 관리된다는 것은 Doctrine 2 코드에서 조금 더 깊습니다. (자세한 내용은 DBAL / Platforms / AbstractPlatform.php 메서드 getInExpression을 참조하십시오. 배열은 IN ()으로 파열됩니다.)

참조 URL : https://stackoverflow.com/questions/6637506/doing-a-where-in-subquery-in-doctrine-2

반응형