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
Libérer: 2025-01-13 22:51:46
original
168 Les gens l'ont consulté

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

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

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!

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