我错过了 Doctrine 的观点吗?它在某些场景中非常有用,但对于使用 Id 检索实体的基本场景(例如使用 find() 或 findOneBy()),为什么您会看到每个关系都触发查询以填充主实体的属性?
当然,使用我创建的映射/注释,Doctrine 应该能够进行一些连接和一个查询,而无需编写 DQL 查询来检索每个实体。
或者,正如我预测的那样,我是否在某个地方错过了重点!
我错过了 Doctrine 的观点吗?它在某些场景中非常有用,但对于使用 Id 检索实体的基本场景(例如使用 find() 或 findOneBy()),为什么您会看到每个关系都触发查询以填充主实体的属性?
当然,使用我创建的映射/注释,Doctrine 应该能够进行一些连接和一个查询,而无需编写 DQL 查询来检索每个实体。
或者,正如我预测的那样,我是否在某个地方错过了重点!
只需将相关实体的别名添加到select
您的部分查询中。
假设您有Book
一对多的关联Cover
,并且您想要选择一些带有封面的书籍。
使用查询生成器,使用:
->createQueryBuilder()
->select("book, cover")
->from("Book", "book")
->leftJoin("book.covers", "cover")
通过查询,使用:
SELECT book, cover FROM Book book LEFT JOIN book.covers cover
结果,您将收到Book
带有预填充集合的$covers
集合。
因为仅在需要时才对关系进行水合 - 默认情况下,Doctrine 使用延迟加载策略。如果您已经知道您将访问相关实体,您应该构建一个 DQL 查询来检索记录和相关实体。