15

我正在尝试在 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()->getResult(); 时它被完全忽略;

我通过启动第一个查询并在第二个查询中手动输入结果来使其工作,但这很难看。

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

谢谢 !

4

1 回答 1

18

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

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

于 2014-07-27T04:27:37.293 回答