使用与外键共享的主键

时间:2016-02-29 21:37:53

标签: symfony doctrine lazy-loading one-to-one hydration

过去已经提出过这个问题的迭代,但这提出了独特的挑战,因为它将一些问题结合在一个更大的问题中。

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

当加载用户对象时(比如$this->getUser(){{ app.user }}),UserExtra数据也会通过连接加载。拥有两个实体的重点是所以我没有必要一次加载所有数据。

我甚至尝试为User定义一个自定义的UserLoaderInterface / UserProviderInterface存储库,确保refreshUser和loadUserByUsername只加载用户数据(我希望UserExtra数据可以放在代理中,除非我明确需要它)但是Doctrine转到Hydrate对象,它发出一个额外的查询来加载UserExtra数据,从而跳过Proxy状态。

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

1 个答案:

答案 0 :(得分:0)

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

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

2)在findfindAll等函数中,OneToOne中的反面自动连接(它总是像获取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关闭了问题

这个问题可以帮助您:one to one relation load