首頁 > 資料庫 > mysql教程 > 如何將 WHERE...IN 子查詢與 Doctrine 2 的查詢產生器一起使用?

如何將 WHERE...IN 子查詢與 Doctrine 2 的查詢產生器一起使用?

Barbara Streisand
發布: 2025-01-13 21:54:47
原創
280 人瀏覽過

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

在 Doctrine 2 的查詢產生器中使用 WHERE...IN 子查詢

此範例示範檢索與包含特定商品的訂單關聯的訂單商品,鏡像 SQL 查詢的功能:

等效 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"><?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>
登入後複製

重要注意事項:

  • Doctrine 2 處理子查詢中的 LIMIT 子句時可能會出現效能限制。
  • 雖然 IN 子句通常需要一個數組,但它也可以容納子查詢。
  • 建議對兩個 id 實例重複使用相同的參數以保持一致性,儘管不是嚴格要求。

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

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