2016-04-26 57 views
0

需要复杂查询的帮助。 服务器接收一些查询参数,比那个查询序列化为json。我需要为每个任务添加平均评分(因此该字段可以从json.item [i] .rating中访问)并按评分排序。Doctrine querybuilder复杂规则

还有一件事:是否有更好的方法来保持平均评分在分贝?我觉得一直计算评分不是好主意。

PS:btw开关情况下更快的空检查?

//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); 

实体:

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

回答

1

最简单的方法(也为整体性能的最佳方式)是您Quest的等级存储在任务表,每次Comment是刷新编辑/添加。你可以使用Doctrine事件。

这样可以解决您的两个问题,因为这样您不必在每次请求时都进行计算,并且在您请求任务表时,会自动选择评级。