(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']);
}
参考文献:
我有以下 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']);
}
参考文献: