Symfony Doctrine - 查询后的 OrderBy

Symfony Doctrine - OrderBy after query

我只想订购上一个主查询的结果。

我想要查看次数最多的前 10 篇文章,然后按 "addedAt date" DESC 排序。

我知道 orderBy 甚至 addOrderBy 等函数,但这不是我需要的,或者我没有实现正确。

获得 5 篇文章前 2 名的示例:

我先摘取浏览量最多的:

  1. e条
  2. 甲条

然后按 addedAt date DESC(最近)排序:

  1. 甲条
  2. e条

我的查询:

public function findMostViewed($limit=10, $asArray=false)
{
        $qb = $this->createQueryBuilder('n')
            ->orderBy('n.nbViews', 'DESC')
            //->addOrderBy('n.addedAt', 'DESC')
            ->getQuery()
            ->setMaxResults($limit);

        return ($asArray) ? $qb->getResult(Query::HYDRATE_ARRAY) : $qb->getResult();
}

如果我知道如何执行 preSelectQuery,它可能会解决问题...

我想到了一个 SQL 查询:

SELECT ...
FROM ...
WHERE id IN(SELECT id FROM News ORDER BY nbViews DESC LIMIT 10)
ORDER BY addedAt DESC

也许如果您使用 'n.addedAt' 的第一个订单,然后 'n.nbViews',就像这样:

$qb = $this->createQueryBuilder('n')
            ->orderBy('n.addedAt', 'DESC')
            ->addOrderBy('n.nbViews', 'DESC')
            ->getQuery()
            ->setMaxResults($limit);

您可以创建子查询并在主查询中使用它:

public function findMostViewed($limit=10, $asArray=false)
{
        $subqb = $this->createQueryBuilder('nn')
            ->orderBy('nn.nbViews', 'DESC')
            ->getQuery()
            ->setMaxResults($limit);

        $qb = $this->createQueryBuilder('n')
            ->where($qb->expr()->in('n.id', $subqb->getDQL())
            ->orderBy('n.addedAt', 'DESC')
            ->getQuery();

        return ($asArray) ? $qb->getResult(Query::HYDRATE_ARRAY) : $qb->getResult();
}

请注意在子查询中使用 nn 而不是 n

根据 Veve 的回答,我更改了 WHERE IN 条件并设法让它工作。

public function findMostViewed($limit=10, $asArray=false)
{
        $subqb = $this->createQueryBuilder('nn')
            ->orderBy('nn.nbViews', 'DESC')
            ->getQuery()
            ->setMaxResults($limit);

        $qb = $this->createQueryBuilder('n')
            ->where('n.id IN (:ids)')
            ->setParameter('ids', array_values($subqb->getResult()))
            ->orderBy('n.addedAt', 'DESC')
            ->getQuery();

        return ($asArray) ? $qb->getResult(Query::HYDRATE_ARRAY) : $qb->getResult();
}

也是工作。 如果将 ->setFirstResult( '1' ) 添加到代码的 Israel Rodriguez Sanchez 作品中

$qb = $this->createQueryBuilder('n')
->orderBy('n.addedAt', 'DESC')
->addOrderBy('n.nbViews', 'DESC')
->getQuery()
->setFirstResult( '1' )
->setMaxResults($limit);