Heim >Datenbank >MySQL-Tutorial >Wie verwende ich eine WHERE...IN-Unterabfrage mit dem Query Builder von Doctrine 2?
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:
<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>
Doctrine 2 Query Builder-Implementierung:
<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>
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!