Symfony/Doctrine: 球员得分的总和和平均值

8
我在我的数据库中有PLAYERS表和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”(17总分数 / 3计分次数)。


我有一个带有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);

If I write this:

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

return $response;

我得到了这个:

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

这是正确的平均值,但是[[{"1":" and "}]]是什么?
2个回答

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

1 是你查询中 avg(g.score) 的索引。为了更好地理解,可以在调用 getResult() 之前,尝试使用 $queryAvgScore->getDql()echo 输出。

让我们回到一般性问题:

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

请注意,我已添加了别名,这比使用索引更好。
希望对你有所帮助。

好的,我最初遇到了很多错误,因为单词“avg”被保护起来了。我在“AS”后使用了“score_avg”,一切都没问题了,但是还有另一个问题:我该如何在模板中编写“avg_score”和“count_score”?我仍然遇到了相同的错误:“注意:在此行进行数组转换为字符串:'$result =(“平均分数:”.$avgScore);“”。 - ginolin
1
尝试通过查询构建器按给定索引检索数组值:$avgScore["avg_score"]$avgScore["count_score"]。如果不起作用,请在该行之前添加此代码片段并发布输出:var_dump($avgScore);exit; - S.Thiongane
我在"$avgScore["count_score"]"这一行遇到了错误: Undefined index: count_score。如果我加上这个dump语句:"var_dump($avgScore); exit;",我会得到以下输出:array(1) { [0]=> array(2) { ["avg_score"]=> string(6) "5.6666" ["count_score"]=> string(1) "3" } } 非常感谢您的帮助。 - ginolin
如果您不想在前面加上[0],则必须通过提供实体来自定义选择... - S.Thiongane
我必须感谢你,因为它起作用了。现在我得到了我需要的东西,但我想要理解它是如何工作的,也为了未来。你能给我发送一些链接来学习这个数组的操作以及如何像这种情况下打印查询结果吗?简而言之,我想深入研究。甚至在你最后的评论中,因为我不明白你的意思。非常感谢。 - ginolin
显示剩余6条评论

4

如果没有找到结果,很遗憾你会得到 NoResultException 异常。 - Justinas R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接