我有一个实体
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 将作者加载到内存中并将其附加到工作单元(或缓存它)。
我发现自己很惊讶没有简单的方法可以做到这一点。我错过了什么吗?谢谢你
您可以通过有目的地选择实体和连接实体来减少查询
$entities = $this->bookRepository
->createQueryBuilder('book')
->join('book.author', 'a')
->select('book', 'a') // addition
->getQuery()
->setFetchMode(Author::class, 'author', ClassMetadataInfo::FETCH_EAGER)
->getResult();
这与“经典的N+1问题”有关。您可以进一步研究。