(Doctrine with Symfony 4) 聚合函数和常规 DQL 语句?

(Doctrine with Symfony 4) Aggregate functions along with a regular DQL statement?

我有以下 DQL 语句,使用 Doctrine 的查询生成器:

如您所见,我带回了所有 post 和他们的评论:

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' does not point to a Class"

所以我查找了其他参考资料,例如:https://symfonycasts.com/screencast/doctrine-queries/select-sum

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

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

您尝试执行的操作存在 2 个问题:

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

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

并且查询将按 根实体 分组,除非指定 ->groupBy()

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

2) 当您尝试 聚合其任何字段时,您不能 select table 的字段[=46] =].它不会起作用并且会产生奇怪的结果。更具体地说,您只会在结果集合中获得一个实体。

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

您的解决方案

由于您已经 select 正在 "comments",只需 "count" 集合结果:

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

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

参考文献: