Maison >base de données >tutoriel mysql >Comment exécuter une sous-requête WHERE…IN à l'aide du générateur de requêtes de Doctrine 2 ?

Comment exécuter une sous-requête WHERE…IN à l'aide du générateur de requêtes de Doctrine 2 ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-13 22:51:46178parcourir

How to Execute a WHERE…IN Subquery Using Doctrine 2's Query Builder?

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!

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