最佳化原則 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>
這個 SQL 查詢有效地達到了預期的結果。 然而,直接在 Doctrine 2 的查詢建構器中複製這一點需要更細緻的方法:
<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>
此 Doctrine 2 程式碼提供了等效的功能。請注意,可能需要針對特定型號進行調整。 潛在的改進領域包括透過子查詢最佳化 IN
子句的效能、探索提高效率的替代方案,以及可能將兩個參數合併為一個以獲得更好的可讀性。 此範例是創建強大且高效的解決方案的基礎。
以上是如何使用 Doctrine 2 高效執行 WHERE ... IN 子查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!