Symfony学说 - 查询后的订单



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

我想要最多的十大文章,然后通过"添加日期" desc。

订购了它

我知道诸如 orderby 或均匀 addorderbyby 之类的功能,但这不是我在这里需要的,或者我没有正确实现它。

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

  • 名称:a ||视图: 100 ||添加: 10 /04/2017
  • 名称:b ||视图:10 ||添加:17/04/2017
  • 名称:C ||视图:50 ||添加:15/04/2017
  • 名称:D ||视图:25 ||添加:2017年12月4日
  • 名称:e ||视图: 200 ||添加: 05 /04/2017

我首先提取最重要的视图:

  1. 文章E
  2. 文章

,然后按添加日期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();
}

如果我知道如何做一个预算法,它可能会解决问题...

我想到了一个SQL查询:

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

您可以制作一个子查询并在主要查询中使用它:

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

也许如果您使用'n.addedat'的第一订单,然后是'n.nbviews',如下:

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

基于 veve 的答案,我更改了状态并设法使其正常工作。

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'(到代码的以色列Rodriguez Sanchez works> works

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

相关内容

  • 没有找到相关文章

最新更新