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