WHERE…IN 하위 쿼리에 대해 Doctrine 2의 쿼리 빌더 활용
이 가이드에서는 특정 항목이 포함된 고유한 주문 항목을 선택하기 위해 Doctrine 2 쿼리를 구성하는 방법을 보여줍니다. 동등한 SQL 쿼리는 다음과 같습니다.
<code class="language-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</code>
Doctrine 2의 쿼리 빌더를 사용하여 이를 복제하는 방법은 다음과 같습니다.
<code class="language-php">/** @var Doctrine\ORM\EntityManager $em */ $expr = $em->getExpressionBuilder(); $qb = $em->createQueryBuilder(); $qb->select(array('DISTINCT i.id', 'i.name', 'o.name')) ->from('Item', 'i') ->join('i.order', 'o') ->where( $expr->in( 'o.id', $qb->createSubquery() ->select('o2.id') ->from('Order', 'o2') ->join('o2.items', 'i2') // Assuming a proper relationship ->where($expr->eq('i2.id', '?1')) ->getDQL() ) ) ->andWhere($expr->neq('i.id', '?2')) ->orderBy('o.orderdate', 'DESC') ->setMaxResults(10) // Use setMaxResults for LIMIT ->setParameter(1, 5) ->setParameter(2, 5); $query = $qb->getQuery(); $results = $query->getResult();</code>
이 향상된 쿼리 빌더 코드는 하위 쿼리를 보다 효율적으로 사용합니다. Order
및 Item
엔터티 사이에 올바르게 정의된 관계가 있다고 가정합니다. setMaxResults(10)
은 잠재적인 하위 쿼리 제한에 의존하는 대신 사용됩니다. Item
및 Order
엔터티가 Doctrine 2 매핑 내에 존재해야 한다는 점을 기억하세요. 잠재적인 극단적인 경우를 처리하려면 철저한 테스트를 수행하는 것이 좋습니다.
위 내용은 Doctrine 2의 쿼리 작성기를 사용하여 WHERE…IN 하위 쿼리를 실행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!