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>
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>
Considérations importantes :
LIMIT
dans les sous-requêtes.IN
attend classiquement un tableau, elle accepte également les sous-requêtes.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!