Doctrine 2 のクエリ ビルダーを WHERE…IN サブクエリに活用する
このガイドでは、特定の商品を含む一意の注文商品を選択する 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 中国語 Web サイトの他の関連記事を参照してください。