2016-04-26 18 views
0

Brauchen Sie Hilfe bei komplexen Abfrage. Server erhalten einige Parameter für die Abfrage, als diese Abfrage Serialisierung zu Json ist. Ich muss eine Durchschnittsbewertung für jede Quest hinzufügen (so dass das Feld von json.item [i] .rating aus zugänglich ist) und sie mit Bewertung sortieren.Doctrine Query Builder komplexen Regel

Und noch eine Sache: gibt es bessere Möglichkeit, durchschnittliche Bewertung in db zu halten? Ich denke, dass das Berechnen der Bewertung die ganze Zeit keine gute Idee ist.

PS: btw Schalter Fall ist schneller für Null überprüfen?

//some params 

$repository = $this->getDoctrine()->getRepository('AppBundle:Quest'); 
     $qb = $repository->createQueryBuilder('q') 
      ->innerJoin('q.city', 'c') 
      ->where('c.id = :city_id') 
      ->setParameter('city_id', $cityId); 

     if($minPlayers != null){ 
      $qb ->andWhere('q.minplayers >= :minplayers') 
       ->setParameter('minplayers', $minPlayers); 
     } 
     if($maxPlayers != null){ 
      $qb ->andWhere('q.maxplayers <= :maxplayers') 
       ->setParameter('maxplayers', $maxPlayers); 
     } 
     if($tagsId != null){ 
      $qb ->innerJoin('q.tags','t') 
       ->andWhere('t.id IN (:tags)') 
       ->setParameter(':tags', implode(",", $tagsId)); 
     } 
     if($organizerId != null){ 
      $qb ->andWhere('q.organizer = :organizer_id') 
       ->setParameter('organizer_id', $organizerId); 
     } 
     if($ispremium != null){ 
      $qb ->andWhere('q.ispremium = :isPremium') 
       ->setParameter('isPremium', $ispremium) 
       ->addOrderBy('q.premiumorder', 'ASC'); 
     } 
     $qb ->setFirstResult($FirstResult) 
      ->setMaxResults($MaxResults); 


     $query = $qb->getQuery(); 

     $paginator = new Paginator($query, $fetchJoinCollection = true); 
     $c = count($paginator); 

     $result = $query->getResult(); 

     $serializer = $this->get('jms_serializer'); 
     $data = $serializer->serialize($result, 'json', 
      SerializationContext::create() 
       ->enableMaxDepthChecks() 
       ->setGroups(array('questSearch')) 
     ); 

     $json ='{"total_count":'.$c.',"items":'.$data.',"amountOfelems":'.$amountOfelems.',"citySlug":'.json_encode($citySlug).',"userId":'.json_encode($userId).'}'; 

     return new JsonResponse($json); 

Einheiten:

class Quest{ 
... 
/** 

    * @OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="quest") 
    */ 
    protected $comments; 
} 



class Comments{ 
/** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
/** 
    * @ORM\Column(type="integer") 
    */ 
    protected $rating; 
/** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Quest", inversedBy="comments") 
    * @ORM\JoinColumn(name="quest_id", referencedColumnName="id") 
    */ 
    protected $quest; 
} 

Antwort

1

Der einfachste Weg (und auch der beste Weg für Gesamtleistungen) ist die Bewertung Ihrer Quest auf der Suche Tabelle zu speichern, und sie jedes Mal neu geladen ein Comment ist bearbeitet/hinzugefügt. Sie können Doctrine-Ereignisse dafür verwenden.

Dies würde beide Ihre Fragen lösen, weil Sie auf diese Weise nicht bei jeder Anfrage berechnen müssen, und die Bewertung wird automatisch ausgewählt, wenn Sie die Quest-Tabelle anfordern.