Exploiter le générateur de requêtes de Doctrine 2 pour les sous-requêtes WHERE…IN
Ce guide montre comment construire une requête Doctrine 2 pour sélectionner des éléments de commande uniques contenant un élément spécifique. La requête SQL équivalente est :
<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>
Voici comment reproduire cela à l'aide du générateur de requêtes de Doctrine 2 :
<code class="language-php">/** @var Doctrine\ORM\EntityManager $em */ $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', $qb->createSubquery() ->select('o2.id') ->from('Order', 'o2') ->join('o2.items', 'i2') // Assuming a proper relationship ->where($expr->eq('i2.id', '?1')) ->getDQL() ) ) ->andWhere($expr->neq('i.id', '?2')) ->orderBy('o.orderdate', 'DESC') ->setMaxResults(10) // Use setMaxResults for LIMIT ->setParameter(1, 5) ->setParameter(2, 5); $query = $qb->getQuery(); $results = $query->getResult();</code>
Ce code de création de requêtes amélioré utilise une sous-requête plus efficacement. Cela suppose une relation correctement définie entre les entités Order
et Item
. setMaxResults(10)
est utilisé au lieu de s'appuyer sur les limitations potentielles des sous-requêtes. N'oubliez pas que les entités Item
et Order
doivent exister dans vos mappages Doctrine 2. Des tests approfondis sont toujours recommandés pour gérer les cas extrêmes potentiels.
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!