2017-04-17 16 views
0

私は以前のメインクエリの結果のみを注文したいと思います。Symfony Doctrine - クエリ後のOrderBy

私はトップ10の記事を見たいのですが、 "addedAt date" DESCで注文してください。

私は、このようなORDERBYあるいはaddOrderByとしての機能を承知しているが、それは私がここで必要なものではありませんか、私はそれを正しく実装していませんよ。

  • 名:5件の記事でトップ2を取得する

    例||ビュー: || addedAt:/04/2017

  • 名前:b ||ビュー:10 || addedAt:17/04/2017
  • 名前:c ||ビュー:50 || addedAt:15/04/2017
  • 名前:d ||ビュー:25 || addedAt:12/04/2017
  • 名前:e ||ビュー: || addedAt:/ 2017年、私が最初にほとんどのビューを抽出

/04:

  1. 条電子

そしてaddedAt日付DESCでorderedIt(最も最近):

  1. Articl EA
  2. 条電子

マイクエリ:

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」、このようなEWSは:

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

いいえ、私が欲しいものではありません。これにより、最新のレコードを取得し、2番目のorderByは、「addedAt」のようなレコードがない場合でも動作しません。 – 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

関連する問題