2017-04-17 7 views
0

Ich möchte nur das Ergebnis der vorherigen Hauptabfrage bestellen.Symfony Doctrine - OrderBy nach Abfrage

Ich möchte die Top 10 der am meisten angesehenen Artikel dann bestellt von "addedAt Datum" DESC.

Ich bin mir dessen bewusst Funktionen wie orderBy oder sogar addOrderBy aber es ist nicht das, was ich brauche hier oder ich die Umsetzung nicht richtig.

Beispiel die Besten 2 auf 5 Artikel zu erhalten:

  • Name: a || Ansichten: || addedAt: /04/2017
  • name: b || Aufrufe: 10 || hinzugefügt am: 17/04/2017
  • name: c || Aufrufe: 50 || hinzugefügt am: 15/04/2017
  • name: d || Aufrufe: 25 || hinzugefügt am: 12/04/2017
  • name: e || Ansichten: || addedAt: /04/2017

ich zuerst die meisten Ansichten extrahieren:

  1. Artikel e
  2. Artikel ein

Und dann orderedIt von addedAt Datum DESC (die meisten kürzlich):

  1. Articl ea
  2. Artikel e

Meine Frage:

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

Wenn ich weiß, wie man ein preSelectQuery zu tun wäre es wahrscheinlich das Problem lösen hat ...

Ich dachte an eine SQL-Abfrage :

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

Antwort

0

Basierend auf Veve 's Antwort, änderte ich die WHERE IN-Bedingung und schaffte es zu arbeiten.

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

Vielleicht, wenn Sie erste Ordnung von 'n.addedAt' verwenden und dann ‚n.nbVi ews', wie folgt aus:

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

Nein, es ist nicht das, was ich will.Damit würde ich die aktuellsten Datensätze und die zweite Reihenfolge bekommen. Es würde nicht einmal funktionieren, wenn es keinen Datensatz mit einem "addedAt" -Ähnlichen gibt. – Doshibu

1

Sie können eine Unterabfrage machen und es in Ihrem Haupt-Abfrage verwenden:

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

Beachten Sie die Verwendung von nn statt n in der Unterabfrage.

+0

Ihr Code hat nicht funktioniert. Es wurde versucht, eine nicht definierte Methode namens "getResult" der Klasse "Doctrine \ ORM \ QueryBuilder" aufzurufen. Die Where In-Bedingung muss begründet sein. Trotzdem habe ich es an deinem Beispiel selbst gelöst und die IN-Bedingung geändert. Vielen Dank :) – Doshibu

Verwandte Themen