У меня трудности с запросом в Symfony - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть Entity tag [id, title] и Entity annonce [id, title] .

Tag и annonce в отношении ManyToMany ,

Итак, у меня есть ассоциация annonce_tag [annonce_id, tag_id]

У меня есть только репозиторий tag и репозиторий annonce , у меня нет хранилища annonce_tag

, и я хочу сделать запрос, чтобы получить ТОП, например, 3 наиболее часто используемых тега

У кого есть предложения сделать этот запрос

/ --------- Обновлено ---------- /

Я пробовал это в хранилище тегов, но не работает

   return $query = $this->createQueryBuilder('t')
        ->select('t.id','count(a)')
        ->innerJoin('t.annonces', 'a')
        ->getQuery()->getResult();

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Вы можете сделать DQL подобным образом

// in annouce repository
$query = $repository->createQueryBuilder('a')
    ->select('COUNT(t) AS HIDDEN usedTags', 'a')
    ->innerJoin('a.tag', 't')
    ->groupBy('t')
    ->orderBy('usedTags', 'DESC')
    ->limit(3)
    ->getQuery()->getResult();

hidden говорит доктрине использовать поле в запросе, но не возвращать его как массив в getResult ()

0 голосов
/ 03 апреля 2019

Вы можете сделать что-то вроде этого:

SELECT tag.id, count(annonce.id) from App:Tag tag JOIN tag.annonces annonce GROUP BY tag.id ORDER BY count(annonce.id) desc

Вы получите упорядоченный список тегов с количеством связанных объявлений для каждого

0 голосов
/ 03 апреля 2019

Вы можете написать DQL-запрос на соединение, как показано ниже, просто измените значения и семантику в соответствии с вашим сценарием:

$query = $repository->createQueryBuilder('t')
    ->select('COUNT(a) AS HIDDEN annonceNumber', 't')
    ->innerJoin('t.annonce', 'a')
    ->groupBy('a')
    ->orderBy('annonceNumber', 'DESC')
    ->limit(3)
    ->getQuery()->getResult();
...