Maison >base de données >tutoriel mysql >Comment exécuter efficacement une sous-requête WHERE... IN avec Doctrine 2 ?

Comment exécuter efficacement une sous-requête WHERE... IN avec Doctrine 2 ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-13 21:36:45568parcourir

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

Optimisation des WHERE ... IN sous-requêtes dans Doctrine 2

Récupérer les articles de commande associés aux commandes contenant un article spécifique présente un défi dans le cadre Doctrine 2. Une solution SQL simple ressemble à ceci :

<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>

Cette requête SQL permet d'obtenir efficacement le résultat souhaité. Cependant, reproduire cela directement dans le générateur de requêtes de Doctrine 2 nécessite une approche plus nuancée :

<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>

Ce code Doctrine 2 fournit un équivalent fonctionnel. Notez que des ajustements spécifiques au modèle peuvent être nécessaires. Les domaines pouvant être améliorés incluent l'optimisation des performances de la clause IN avec des sous-requêtes, l'exploration d'alternatives pour améliorer l'efficacité et la consolidation potentielle des deux paramètres en un seul pour une meilleure lisibilité. Cet exemple sert de base pour créer une solution robuste et efficace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn