Maison > base de données > tutoriel mysql > Comment utiliser une sous-requête WHERE...IN avec le générateur de requêtes de Doctrine 2 ?

Comment utiliser une sous-requête WHERE...IN avec le générateur de requêtes de Doctrine 2 ?

Barbara Streisand
Libérer: 2025-01-13 21:54:47
original
280 Les gens l'ont consulté

How to Use a WHERE...IN Subquery with Doctrine 2's Query Builder?

Utilisation de sous-requêtes WHERE...IN dans le générateur de requêtes de Doctrine 2

Cet exemple montre la récupération des articles de commande associés aux commandes contenant un article spécifique, reflétant la fonctionnalité d'une requête SQL :

Requête SQL équivalente :

<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

Implémentation du générateur de requêtes Doctrine 2 :

<code class="language-php"><?php // Access Doctrine's ExpressionBuilder
$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',
            $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

Considérations importantes :

  • Des limitations de performances peuvent survenir avec la gestion par Doctrine 2 des clauses LIMIT dans les sous-requêtes.
  • Bien que la clause IN attend classiquement un tableau, elle accepte également les sous-requêtes.
  • La réutilisation du même paramètre pour les deux id instances est recommandée pour des raisons de cohérence, bien que cela ne soit pas strictement obligatoire.

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