(带有Symfony 4的文档)聚合函数以及常规DQL语句?

时间:2019-01-04 05:47:10

标签: count aggregate dql

使用Doctrine的querybuilder,我有以下DQL语句:

如您所见,我将带回所有帖子及其评论:

public function getAllPosts(User $user){

    $qb = $this->createQueryBuilder('p');
    $qb->select('p, postPhotos,postVideos, comments, commentUser, commentUserPhoto, replyComments, commentReplyUser, commentReplyUserPhoto, postTier,creator,creatorPhoto,creatorTiers,creatorSubscriptions')
        ->leftJoin('p.photos', 'postPhotos')
        ->leftJoin('p.videos', 'postVideos')
        ->leftJoin('p.comments', 'comments')
        ->leftJoin('comments.user', 'commentUser')
        ->leftJoin('commentUser.photos', 'commentUserPhoto', 'WITH', 'commentUserPhoto.type = :profileType')
        ->leftJoin('comments.children', 'replyComments')

我已经尝试添加

->addSelect("COUNT(p.comments) as countComments")

我只是得到一个错误,“ countComments'不指向类”

因此,我查找了其他参考,例如:https://symfonycasts.com/screencast/doctrine-queries/select-sum

但是它没有给出如何在DQL查询的结果中包括计数的示例。

我是否只需要在评论存储库中创建自己的count函数,并遍历我的原始数据集,并在每个帖子中调用一次?

1 个答案:

答案 0 :(得分:0)

您要执行的操作有2个问题:

1)您应该在聚合函数中使用 join别名“ comments” ,而不是关系字段“ p.comments”:

->addSelect("COUNT(comments) as countComments")

,除非指定->groupBy(),否则查询将被根实体分组

但这不是您的解决方案,真正的问题是:

2)尝试汇总表的任何字段时,您不能选择表的字段。它不会起作用,并且会产生奇怪的结果。更具体地说,结果集中只会得到一个实体。

更多why cant you mix aggregate values and non aggregate values in a single select

您的情况下的解决方案

由于您已经选择了“评论”,因此只需 “计数” 即可:

$posts = $queryBuilder->getQuery()->getResult();
foreach($posts as $post) {
    echo $post->getComments()->count();
}

$posts = $queryBuilder->getQuery()->getArrayResult();
foreach($posts as $post) {
    echo count($post['comments']);
}

参考文献: