首頁 > 資料庫 > mysql教程 > 如何使用 Doctrine 2 高效執行 WHERE ... IN 子查詢?

如何使用 Doctrine 2 高效執行 WHERE ... IN 子查詢?

Susan Sarandon
發布: 2025-01-13 21:36:45
原創
559 人瀏覽過

How to Efficiently Perform a WHERE ... IN Subquery with Doctrine 2?

最佳化原則 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板