(Учение с Symfony 4) Агрегатные функции вместе с обычным оператором DQL? - PullRequest
0 голосов
/ 04 января 2019

У меня есть следующий оператор DQL, использующий построитель запросов Doctrine:

Как вы видите, я возвращаю все сообщения и их комментарии:

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.

Нужно ли мне просто создать свою собственную функцию подсчета в репозитории комментариев и выполнить цикл по исходному набору данных, вызывая его один раз для каждого сообщения?

1 Ответ

0 голосов
/ 05 января 2019

Есть 2 проблемы с тем, что вы пытаетесь сделать:

1) Вы должны использовать псевдоним соединения "comments" , а не поле отношения "p.comments" вагрегатная функция:

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

и запрос будет сгруппирован по корневой сущности, если не указано ->groupBy().

Но это не решение в вашейВ этом случае реальная проблема заключается в том, что:

2) Вы не можете выбрать поля таблицы , когда пытаетесь агрегировать любое из ее полей .Это не будет работать и даст странные результаты.Точнее говоря, вы получите только одну сущность в коллекции результатов.

Подробнее , почему вы не можете смешивать агрегированные и неагрегированные значения за один выбор

Решение в вашем случае

Так как вы уже выбираете "комментарии", просто "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']);
}

Ссылки:

...