学说2限制IN子查询

时间:2013-01-09 11:28:59

标签: doctrine-orm subquery limit dql

我正在尝试在Doctrine2中的IN语句中使用子查询。

以下是原始SQL查询的外观:

SELECT * FROM license 
WHERE id 
IN (SELECT id 
    FROM license 
    WHERE subscription = x 
    ORDER BY date DESC
    LIMIT 5)
ORDER BY name ASC;

我想要做的是显示按姓名排序的最后5个结果,所以我必须首先查询最后5个结果,然后在主查询中按名称排序。

问题在于我似乎无法限制内部查询。

这是我目前的代码:

$qb = $this->createQueryBuilder('l');
$qb->select('l.id');
$qb = $this->whereSubscriptionId($qb, $subscription_id);
$qb = $this->offsetLimitOrder($qb, 0, 5, 'deliveryDatetime desc');

//Second Query, adds the "order by X"
$qb2 = $this->createQueryBuilder('l2');
$qb2->add('where', $qb2->expr()->in('l2.id', $qb->getQuery()->getDQL()));
if(isset($order)){
    $order = explode(' ', $order);
    $qb2->addOrderBy('l2.'.$order[0], $order[1]);
 }

 return $qb2->getQuery()
            ->getResult();

正如您所看到的,我创建了我的第一个查询,我订购并限制它(通过自定义方法),然后我尝试在第二个查询中使用它。

然而,似乎LIMIT不是DQL语句的一部分,因为当我var_dump第一个查询的DQL时,LIMIT不存在,这意味着当我运行$ qb2-> getQuery()时,它会被完全忽略 - &gt ;的getResult();

我通过启动第一个查询并在第二个查询中手动输入结果来实现它,但它很难看。

关于如何正确地做到这一点的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:16)

不幸的是,Doctrine不支持嵌套查询的限制。即使在内部QueryBuilder上使用2个QueryBuilders和setMaxResults(),也只会忽略它。

此时执行此操作的唯一方法是运行2个单独的查询。