Symfony Doctrine QueryBuilder - Получить последние опубликованные новости каждой категории - PullRequest
1 голос
/ 28 марта 2019

Итак, я видел много вопросов о моей проблеме (наибольший n-на-группу), но кажется, что я просто не могу заставить его работать с queryBuilder! (например: сообщение )
Я использую Symfony 4.2.2

Сущность

-------------                    -------------
News                             Taxonomy
-------------                    -------------
id                               id
title                            name
category (ManyToOne Taxonomy)    value
status (ManyToOne Taxonomy)
publication_date

Категория может принимать следующие значения: tech / sports / games .. и т. Д.
Статус может принимать следующие значения: черновик / запланированный / опубликованный.

Что я хочу

В моем репозитории новостей, использующем queryBuilder, я хотел бы вернуть последние опубликованные новости каждой категории .

Что я в итоге сделал

return $this->createQueryBuilder('a')
            ->select('n news', 'n.publicationDate pubDate')
            ->leftJoin('n.category', 'c')
            ->addSelect('c.value category')
            ->leftJoin('n.status', 's')
            ->addSelect('s.value status')
            ->andWhere('s.value = :st')
            ->setParameter('st', Taxonomy::WORKFLOW_PUBLISHED)
            ->orderBy('n.category, n.datePublication', 'DESC')
            ->getQuery()
            ->getResult();

Таксономия :: WORKFLOW_PUBLISHED - константа хранения класса: 'опубликовано' Затем в сервисе я просто перебираю результаты, полученные предыдущим методом, и извлекаю последние новости по категориям.
Мне не нравится это временное решение, так что если кто-нибудь сможет мне помочь с queryBuilder, это будет здорово!

+ Дополнительная информация

Я пытался сгруппировать по категориям, но он не возвращал последние значения.
Если возможно, я тоже ищу хорошую производительность.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

вы пробовали groupBy в своем запросе или в форме?

Возможно, параметры 'group_by' в форме сделают эту работу:

'query_builder' => function(NewsRepository $r)use($options)
                {
                    return $r->yourQuery($options['opt']);
                },
'group_by' => function(News $news)
                {
                    return $news->getCategory()->getName();
                },

Я имею в виду, если вы используете orderBy в своем запросе для получения последних новостей и используете 'group_by' в форме по названию категории, это будет работать.

Получить заказ по query_builder и, наконец, выполнить сортировку с параметром group_by в форме.

0 голосов
/ 28 марта 2019

, так как group by не заботится о порядке данных, вы не можете сделать это одним запросом.

лучше использовать группу по категориям и выбрать max (n.id) затем сделайте еще один запрос, чтобы найти релевантные новости по этим идентификаторам

...