我的数据库中有标签:播放器和标签: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”:“和”}]] ?????
答案 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