2017-04-17 77 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