【问题标题】:Doctrine INDEX BY foreign key学说 INDEX BY 外键
【发布时间】:2016-01-06 09:50:50
【问题描述】:

我正在尝试从使用文章 ID 索引的 article_stats 表中获取文章的摘要数据。

查询生成器如下所示:

$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)'),但也没有用。

那么如何从外键索引的数据库中选择数据呢?

【问题讨论】:

    标签: php symfony doctrine-orm query-builder


    【解决方案1】:

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

    下面有一个例子:

    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 不是这里的根别名。
    【解决方案2】:

    试试这样:

    $qb = $em->createQueryBuilder();
    
    $qb->select('SUM(ass.pageviews)')
       ->from('YourBundle:article_stats', 'ass', 'ass.article')
       ->groupBy('ass.article');
    
    $articleStats = $qb->getQuery()->getArrayResult();
    

    【讨论】:

    • 这会产生与原始尝试完全相同的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2017-05-19
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多