使用 Doctrine 通过单个 JOIN 查询预加载关系

问题描述 投票:0回答:1

我有一个实体

Author
Book
有关系,其中一位作者有很多书。

我的图书馆里有很多书,我想使用 JOIN 一次性检索所有这些书及其作者信息。我是否立即检索它们并不重要,我只想将它们加载到内存中。

            $entities = $this->bookRepository
                ->createQueryBuilder('book')
                ->join('book.author', 'a')
                ->getQuery()
                ->setFetchMode(Author::class, 'author', ClassMetadataInfo::FETCH_EAGER)
                ->getResult();

这会在我的图书上生成一个 SELECT 查询(选择所有图书字段),并在作者上生成一个 INNER JOIN(不选择任何字段)。因此,对作者表有很多请求,因为它们没有被提取并保存到工作单元中。

我想要做的是减少 SQL 查询的数量,并使用此 JOIN 将作者加载到内存中并将其附加到工作单元(或缓存它)。

我发现自己很惊讶没有简单的方法可以做到这一点。我错过了什么吗?谢谢你

php symfony doctrine-orm
1个回答
0
投票

您可以通过有目的地选择实体和连接实体来减少查询

            $entities = $this->bookRepository
                ->createQueryBuilder('book')
                ->join('book.author', 'a')
                ->select('book', 'a') // addition
                ->getQuery()
                ->setFetchMode(Author::class, 'author', ClassMetadataInfo::FETCH_EAGER)
                ->getResult();

这与“经典的N+1问题”有关。您可以进一步研究。

© www.soinside.com 2019 - 2024. All rights reserved.