0

过去曾多次提出过这个问题,但这带来了独特的挑战,因为它将一些问题结合在一个更大的问题中。

我有一个实体(用户)在我的应用程序中用作用户类,然后我有另一个实体(UserExtra),与用户实体一对一关系,UserExtra 的 id 与 User 相同。外键与主键相同。

当加载用户对象时(比如 by$this->getUser()或 by {{ app.user }},UserExtra 数据也通过连接加载。拥有两个实体的全部意义在于我不必一次加载所有数据。

我什至尝试为用户定义一个自定义 UserLoaderInterface/UserProviderInterface 存储库,确保 refreshUser 和 loadUserByUsername 只会加载用户数据(我希望 UserExtra 数据位于代理中,除非我明确需要它)但是当 Doctrine 去水合对象,它发出一个额外的查询来加载 UserExtra 数据,从而跳过代理状态。

有没有办法解决这个问题?

4

1 回答 1

0

您的问题有很多解决方案:

1) 改变拥有方和反方http://developer.happyr.com/choose-owning-side-in-onetoone-relation - 从数据库设计的角度来看,我不认为每次都是正确的。

2) 在 , 等函数中findfindAllOneToOne 的反面是自动连接的(它总是像 fetch EAGER 一样)。但在 DQL 中,它不像 fetch EAGER 那样工作,并且需要额外的查询。可能的解决方案是每次都加入反向实体

3) 如果替代结果格式(即getArrayResult())对于某些用例来说足够了,那也可以避免这个问题。

4) 将反面更改为 OneToMany - 只是看起来不对,可能是临时的解决方法。

5)强制部分对象。没有额外的查询,但也没有延迟加载:$query->setHint (Query::HINT_FORCE_PARTIAL_LOAD, true)-对我来说,这是唯一可能的解决方案,但并非没有代价:部分对象有点冒险,因为您的实体行为不正常。例如,如果您未在->select()所有关联中指定您将使用的用户,则可能会出现错误,因为您的对象不会满,所有未特别选择的关联都将为空

6)不映射反向双向 OneToOne 关联并使用显式服务或更主动的记录方法 - https://github.com/doctrine/doctrine2/pull/970#issuecomment-38383961 - 看起来 Doctrine 已关闭问题

这个问题可以帮助你:一对一的关系负载

于 2016-02-29T23:09:47.740 回答