利用 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>
这个改进的查询生成器代码更有效地使用子查询。 它假设 Order
和 Item
实体之间存在正确定义的关系。 使用 setMaxResults(10)
而不是依赖潜在的子查询限制。请记住,实体 Item
和 Order
必须存在于您的 Doctrine 2 映射中。 仍然建议进行彻底的测试来处理潜在的边缘情况。
以上是如何使用 Doctrine 2 的查询生成器执行 WHERE…IN 子查询?的详细内容。更多信息请关注PHP中文网其他相关文章!