Heim >Datenbank >MySQL-Tutorial >Wie verwende ich eine WHERE...IN-Unterabfrage mit dem Query Builder von Doctrine 2?

Wie verwende ich eine WHERE...IN-Unterabfrage mit dem Query Builder von Doctrine 2?

Barbara Streisand
Barbara StreisandOriginal
2025-01-13 21:54:47289Durchsuche

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

Einsatz von WHERE...IN-Unterabfragen im 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:

  • Leistungseinschränkungen können bei der Behandlung von LIMIT-Klauseln in Unterabfragen durch Doctrine 2 auftreten.
  • Während die IN-Klausel herkömmlicherweise ein Array erwartet, unterstützt sie auch Unterabfragen.
  • Die Wiederverwendung desselben Parameters für beide 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn