ホームページ >データベース >mysql チュートリアル >Doctrine 2 のクエリ ビルダーで WHERE...IN サブクエリを使用するにはどうすればよいですか?

Doctrine 2 のクエリ ビルダーで WHERE...IN サブクエリを使用するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-13 21:54:47283ブラウズ

How to Use a WHERE...IN Subquery with Doctrine 2's Query Builder?

Doctrine 2 のクエリ ビルダー内で WHERE...IN サブクエリを使用する

この例では、SQL クエリの機能を反映して、特定の商品を含む注文に関連付けられた注文商品を取得する方法を示します。

同等の 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"><?php // Access Doctrine's ExpressionBuilder
$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',
            $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);</code>

重要な考慮事項:

  • Doctrine 2 によるサブクエリ内の LIMIT 句の処理により、パフォーマンスの制限が発生する可能性があります。
  • IN 句は従来配列を想定していますが、サブクエリにも対応します。
  • 厳密に必須ではありませんが、一貫性を保つために両方の id インスタンスで同じパラメータを再利用することをお勧めします。

以上がDoctrine 2 のクエリ ビルダーで WHERE...IN サブクエリを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。