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