Doctrine INDEX BY 外键

4

我正在尝试获取文章统计表中按文章ID索引的文章摘要数据。

查询构建器如下所示:

$qb = $this->articlesStatsRepository->createQueryBuilder('ass');
$qb->select('SUM(ass.pageviews)')
    ->indexBy('ass', 'ass.article') // this doesnt work
    ->groupBy('ass.article');

$articleStats = $query->getResult();

这会导致查询结果。
SELECT SUM(ass.pageviews) 
FROM AppBundle\Entity\ArticleStats ass 
INDEX BY ass.article 
GROUP BY ass.article

带有错误:

[Semantical Error] near 'article GROUP': 
Error: Invalid PathExpression. Must be a StateFieldPathExpression.

我尝试过->indexBy('ass', 'IDENTITY(ass.article)'),但也没有起作用。
那么我该如何选择由外键索引的数据库数据?
2个回答

3

如果没有看到实体及其关系的确切组成,很难给出精确的答案。即便如此,如果ass.article是一个实体,而不是数字文章ID,则该查询将无法工作。 必须使用ORM列来使用INDEX BY

以下是一个示例:

SELECT a.id, SUM(c.visits) AS visits
FROM Customer c
LEFT JOIN c.account a
INDEX BY a.id
GROUP BY a.id

$results将包含按名称索引的实体的关联数组。如果要使用外键进行此操作,则可能需要先执行连接或使用嵌套DQL。也有可能INDEX BY不能以您想要的确切方式工作。解决方法如下(将ID作为关联数组的一部分而不是数组键):

SELECT a.id, SUM(c.visits) AS visits
FROM Customer c
LEFT JOIN c.account a
GROUP BY a.id

如果您在阅读本答案后仍无法使其正常工作,我建议提供有关实体和任何相关关系的其他信息。

这是行不通的,indexBy 需要一个根别名:a 在这里不是根别名。 - theredled

-1

试试这样:

$qb = $em->createQueryBuilder();

$qb->select('SUM(ass.pageviews)')
   ->from('YourBundle:article_stats', 'ass', 'ass.article')
   ->groupBy('ass.article');

$articleStats = $qb->getQuery()->getArrayResult();

1
这将产生与原始尝试完全相同的结果。 - Elwhis

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