2017-04-17 61 views
0

后,我想订先前的主查询的唯一结果。Symfony的学说 - 排序依据查询

我想那么10个最看的文章由“addedAt日期” DESC下令。

我所知道的功能,例如排序依据甚至addOrderBy,但它不是我所需要的这里还是我没有正确地实现它。

实例让高层2月5篇:

  • 名称:一个|| views: || addedAt:/04/2017年
  • 名称:B ||意见:10 || addedAt:17/04/2017
  • 名称:C || views:50 || addedAt:15/04/2017
  • 名:d ||观点:25 || addedAt:2017年12月4日
  • 姓名:E || views: || addedAt:/04/2017年

我第一次提取最观点:

  1. E条
  2. 第一个

然后通过addedAt日期DESC orderedIt(最最近):

  1. Articl EA
  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 

回答

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

也许如果你使用'n.addedAt'的第一顺序,然后'n.nbVi EWS',像这样:

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

不,这不是我想要的。有了这个,我会得到最新的记录,如果没有记录的“addedAt”类似,那么第二个orderBy将不起作用。 – Doshibu

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

+0

你的代码没有工作。试图调用类“Doctrine \ ORM \ QueryBuilder”中名为“getResult”的未定义方法。 Where In条件必须是原因。即使如此,我自己解决了你的例子,并改变了IN条件。谢谢 :) – Doshibu