Dieses Beispiel zeigt das Abrufen von Bestellpositionen, die mit Bestellungen verknüpft sind, die einen bestimmten Artikel enthalten, und spiegelt die Funktionalität einer SQL-Abfrage wider:
Äquivalente SQL-Abfrage:
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;
Doctrine 2 Query Builder-Implementierung:
<?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);
Wichtige Überlegungen:
LIMIT
-Klauseln in Unterabfragen durch Doctrine 2 auftreten.IN
-Klausel herkömmlicherweise ein Array erwartet, unterstützt sie auch Unterabfragen.id
Instanzen wird aus Konsistenzgründen empfohlen, ist jedoch nicht unbedingt erforderlich.Das obige ist der detaillierte Inhalt vonWie verwende ich eine WHERE...IN-Unterabfrage mit dem Query Builder von Doctrine 2?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!