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!