使用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函数,并遍历我的原始数据集,并在每个帖子中调用一次?
答案 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']);
}
参考文献: