【问题标题】:Doctrine querybuilder complex ruleDoctrine querybuilder 复杂规则
【发布时间】:2016-04-26 13:18:54
【问题描述】:

在复杂查询方面需要帮助。 服务器接收一些查询参数,而不是该查询序列化为 json。我需要为每个任务添加平均评分(以便可以从 json.item[i].rating 访问该字段)并使用评分对其进行排序。

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

PS: 顺便说一句,switch case 对于空检查来说更快吗?

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

【问题讨论】:

    标签: symfony doctrine-orm dql


    【解决方案1】:

    最简单的方法(也是整体表现的最佳方法)是将您的Quest 的评分存储在任务表中,并在每次编辑/添加Comment 时刷新它。您可以为此使用 Doctrine Events。

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

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 2017-08-05
      • 2020-01-10
      • 2012-05-13
      • 2011-12-21
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多