Symfony / Doctrine:玩家的SUM和AVERAGE得分

时间:2013-11-16 20:23:29

标签: sql symfony doctrine-orm sum average

我的数据库中有标签:播放器和标签:SCORES。

在SCORES标签中,我有以下行:ID - IDPLAYER - SCORE

例如:

ID   IDPLAYER   SCORE
---------------------
1       1         5
2       2         4
3       1         3
4       2         1
5       1         9

我想放一个模板:

对于“玩家1 ”,有 3 分数。

分数的计数为“ 17 ”(9 + 3 + 5)。

玩家得分的平均值为“ 5.6 ”(17totscores / 3countScores)。


我有一个ORM实体,没问题。

我有一个具有此功能的控制器:

public function avgScoreAction($id) {

$queryScore = $this->getDoctrine()
->getRepository('AcmeBundle:tabScores');

$queryAvgScore = $queryScore->createQueryBuilder('g')
->select("avg(g.score)")
->where('g.idPlayer = :idPlayer')
->setParameter('idPlayer', $id)
->getQuery();

$avgScore = $queryAvgScore->getResult();

$result = ("Score average: ".$avgScore);

return new Response($result);

但我有一个错误:

"Notice: Array to string conversion in this line:"

$result = ("Score average: ".$avgScore);

如果我写这个:

$response = new Response();
$response->setContent(json_encode(array($avgScore)));
$response->headers->set('Content-Type', 'application/json');

return $response;

我明白了:

[[{"1":"5.6667"}]]

这是正确的平均值,但是:[[{“1”:“和”}]] ?????

2 个答案:

答案 0 :(得分:10)

what is: [[{"1":" and "}]]  ?

1是查询中avg(g.score)的索引。为了更好地理解原因,请在echo之前尝试$queryAvgScore->getDql() getResult()

让我们回到一般问题:

SQL是:

SELECT AVG(SCORE) as AVG, COUNT(SCORE) as COUNT, IDPLAYER as PLAYER FROM SCORES GROUP BY IDPLAYER

现在使用查询构建器:

$queryAvgScore = $queryScore->createQueryBuilder('g')
->select("avg(g.score) as score_avg, count(g.score) as score_count")
->where('g.idPlayer = :idPlayer')
->groupBy('g.idPlayer')
->setParameter('idPlayer', $id)
->getQuery();

请注意,我添加了aliases,这比使用索引要好。

希望它有所帮助。

答案 1 :(得分:4)

使用DQL,Symfony 2.6很容易

$dql = "SELECT SUM(e.amount) AS balance FROM Bank\Entities\Entry e " .
       "WHERE e.account = ?1";

$balance = $em->createQuery($dql)
              ->setParameter(1, $myAccountId)
              ->getSingleScalarResult();

的信息:

http://doctrine-orm.readthedocs.org/en/latest/cookbook/aggregate-fields.html?highlight=sum