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

Doctrine 2 で WHERE ... IN サブクエリを効率的に実行するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-13 21:36:45
オリジナル
559 人が閲覧しました

How to Efficiently Perform a WHERE ... IN Subquery with Doctrine 2?

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>
ログイン後にコピー

この SQL クエリは、望ましい結果を効率的に達成します。 ただし、これを Doctrine 2 のクエリ ビルダーで直接複製するには、より微妙なアプローチが必要です。

<code class="language-php">$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);</code>
ログイン後にコピー

この Doctrine 2 コードは機能的に同等のものを提供します。モデル固有の調整が必要な場合があることに注意してください。 改善の可能性がある領域には、サブクエリを使用した IN 句のパフォーマンスの最適化、効率を向上させるための代替案の検討、読みやすさを向上させるために 2 つのパラメータを 1 つに統合する可能性などが含まれます。 この例は、堅牢で効率的なソリューションを作成するための基礎として機能します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート