DocIND的INDEX BY外键

时间:2016-01-06 09:50:50

标签: php symfony doctrine-orm query-builder

我正在尝试获取article_stats表中使用文章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 个答案:

答案 0 :(得分:3)

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

下面列出了一个例子:

<?php
$query = $em->createQuery('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 = $query->getResult();

$results将包含按名称索引的实体的关联数组。要使用外键执行此操作,您可能必须先进行连接,或使用嵌套的DQL。 INDEX BY也可能无法以您想要的方式运行。解决方法看起来像这样(包括ID作为关联数组的一部分而不是数组键):

<?php
$dql = 'SELECT a.id, SUM(c.visits) AS visits FROM Customer c LEFT JOIN c.account a GROUP BY a.id';

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

答案 1 :(得分:-1)

试试这样:

$qb = $em->createQueryBuilder();

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

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