Symfony Doction QueryBuilder-获取每个类别的最新已发布新闻

时间:2019-03-28 15:10:49

标签: symfony doctrine greatest-n-per-group query-builder

所以我看过很多关于我的问题的主题(每组最多一次),但是似乎我无法使其与queryBuilder一起使用! (例如:post
我正在运行symfony 4.2.2

实体

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

类别可以采用以下值:技术/体育/游戏..依此类推。
状态可以采用以下值:草稿/计划的/已发布。

我想要的东西

在我的使用queryBuilder的Ne​​wsRepository中,我想返回每个类别最新最新发布的新闻。

我最终在做什么

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();

Taxonomy :: WORKFLOW_PUBLISHED是存储:“已发布”的类常量 然后在服务中,我只是迭代以前方法返回的结果,并提取每个类别的最新新闻。
我不喜欢这种临时解决方案,因此,如果有人可以帮助我使用queryBuilder,那就太好了!

+其他信息

我尝试了groupby的类别,但没有返回最新值。
如果可能的话,我也在寻找良好的性能。

3 个答案:

答案 0 :(得分:0)

由于group by不关心数据的顺序,因此您无法通过一个查询来做到这一点。

最好使用按类别分组并选择max(n.id) 然后再进行查询以通过这些ID查找相关新闻

答案 1 :(得分:0)

您是否在查询或表单中尝试过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选项进行排序。

答案 2 :(得分:0)

如果您看到原始的post: Doctrine Query Language get Max/Latest Row Per Group,则需要对0xE0, 0x24, 0x7A, 0x73 实体进行自我联接,以便组织所需的数据(每个类别的最新新闻),在对原始帖子进行调整之后,您的查询构建器可能会看起来像喜欢

News