利用 Doctrine 2 的查詢產生器進行 WHERE…IN 子查詢
本指南示範如何建立 Doctrine 2 查詢來選擇包含特定商品的唯一訂單商品。等效的 SQL 查詢是:
<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 的查詢建構器來複製此內容:
<code class="language-php">/** @var Doctrine\ORM\EntityManager $em */ $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', $qb->createSubquery() ->select('o2.id') ->from('Order', 'o2') ->join('o2.items', 'i2') // Assuming a proper relationship ->where($expr->eq('i2.id', '?1')) ->getDQL() ) ) ->andWhere($expr->neq('i.id', '?2')) ->orderBy('o.orderdate', 'DESC') ->setMaxResults(10) // Use setMaxResults for LIMIT ->setParameter(1, 5) ->setParameter(2, 5); $query = $qb->getQuery(); $results = $query->getResult();</code>
這種改進的查詢產生器程式碼更有效地使用子查詢。 它假設 Order
和 Item
實體之間存在正確定義的關係。 使用 setMaxResults(10)
而不是依賴潛在的子查詢限制。請記住,實體 Item
和 Order
必須存在於您的 Doctrine 2 映射中。 仍然建議進行徹底的測試來處理潛在的邊緣情況。
以上是如何使用 Doctrine 2 的查詢產生器執行 WHERE…IN 子查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!