首页 > 数据库 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板