使用createQueryBuilder计算Doctrine中的多个投票选择

时间:2017-05-28 22:25:03

标签: php symfony doctrine-orm

我正在开发一个投票系统,用户可以对某个问题投票赞成,不投票或不投票。

这些表存储在voteOptionschoice中,其值为0,1和2,附加到存储其他信息的vote表。我努力研究如何在单一功能中计算投票数。

以下功能统计单个choice,我目前为每个voteOption调用一次。我计算不同的用户,因为他们可以出现不止一次,但只有他们的最后一次投票才算得上:

public function countPollVotesByIsCurrentAndChoice(Poll $poll, $choice) {
    return $this->createQueryBuilder('v')
        ->leftJoin('v.voteOptions', 'vo')
        ->andWhere('v.poll = :poll')
        ->andWhere('v.isCurrentVote = :isCurrentVote')
        ->andWhere('vo.choice = :choice')
        ->setParameters(['isCurrentVote' => true, 'poll' => $poll, 'choice' => $choice])
        ->select('COUNT(DISTINCT v.user) AS vote_count')
        ->getQuery()
        ->getSingleScalarResult();
}

但我更愿意拨打一个电话来获得所有3项罪名。我真的很感激有关如何做到这一点的任何建议。

1 个答案:

答案 0 :(得分:0)

您必须将COUNT()与GROUP BY一起使用,它将选项聚合为三个可能的答案,COUNT函数计算每个答案的记录数。

$query = $em->createQuery('SELECT count(vo.choice) AS cnt FROM AppBundle:Vote v JOIN v.voteOptions vo WHERE ... GROUP BY vo.choice');
$result = $query->getResult();

此查询不会返回包含Vote对象的数组,而只返回包含列名和值的行的数组。 print_r()会帮助你