Symfony Doctrine - 在查询后{Order}

时间:2017-04-17 10:52:31

标签: php doctrine-orm symfony-2.8

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

我希望前10个观看次数最多的文章然后通过"添加日期" DESC。

我知道 orderBy 甚至 addOrderBy 等功能,但这不是我在这里所需要的,或者我没有实现它正确。

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

  • 名称:a ||观点: 100 ||已添加: 10 / 04/2017
  • 名称:b ||观点:10 ||已添加:2017/04/17
  • 名称:c ||观点:50 || addedAt:15/04/2017
  • 名称:d ||观点:25 || addedAt:12/04/2017
  • 名称:e ||观点: 200 || addedAt: 05 / 04/2017

我首先提取最多的观点:

  1. 第e条
  2. 第一条
  3. 然后命令它添加日期DESC(最新):

    1. 第一条
    2. 第e条
    3. 我的查询:

      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
      

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

基于 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();
}

答案 3 :(得分:0)

这也是工作。 如果将-> setFirstResult('1')添加到代码的以色列罗德里格斯·桑切斯的工作

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