Optimierung von WHERE ... IN
Unterabfragen in Lehre 2
Das Abrufen von Bestellpositionen, die mit Bestellungen verknüpft sind, die einen bestimmten Artikel enthalten, stellt im Rahmen von Doctrine 2 eine Herausforderung dar. Eine einfache SQL-Lösung sieht so aus:
<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>
Diese SQL-Abfrage erzielt effizient das gewünschte Ergebnis. Die direkte Replikation im Abfrage-Builder von Doctrine 2 erfordert jedoch einen differenzierteren Ansatz:
<code class="language-php">$expr = $em->getExpressionBuilder(); $em->createQueryBuilder() ->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>
Dieser Doctrine 2-Code bietet ein funktionales Äquivalent. Beachten Sie, dass modellspezifische Anpassungen erforderlich sein können. Bereiche für mögliche Verbesserungen umfassen die Optimierung der Leistung der IN
-Klausel mit Unterabfragen, die Untersuchung von Alternativen zur Verbesserung der Effizienz und möglicherweise die Konsolidierung der beiden Parameter in einem für eine bessere Lesbarkeit. Dieses Beispiel dient als Grundlage für die Erstellung einer robusten und effizienten Lösung.
Das obige ist der detaillierte Inhalt vonWie führt man mit Doctrine 2 effizient eine WHERE ... IN-Unterabfrage durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!