首頁 > 資料庫 > mysql教程 > 如何使用 Doctrine 2 的查詢產生器執行 WHERE…IN 子查詢?

如何使用 Doctrine 2 的查詢產生器執行 WHERE…IN 子查詢?

Linda Hamilton
發布: 2025-01-13 22:51:46
原創
168 人瀏覽過

How to Execute a WHERE…IN Subquery Using Doctrine 2's Query Builder?

利用 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>
登入後複製

這種改進的查詢產生器程式碼更有效地使用子查詢。 它假設 OrderItem 實體之間存在正確定義的關係。 使用 setMaxResults(10) 而不是依賴潛在的子查詢限制。請記住,實體 ItemOrder 必須存在於您的 Doctrine 2 映射中。 仍然建議進行徹底的測試來處理潛在的邊緣情況。

以上是如何使用 Doctrine 2 的查詢產生器執行 WHERE…IN 子查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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