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
Libérer: 2025-01-13 21:36:45
original
559 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal