gpt4 book ai didi

symfony - 使用与外键共享的主键以一对一关系建立用户对象

转载 作者:行者123 更新时间:2023-12-03 11:20:53 24 4
gpt4 key购买 nike

过去已经提出过对该问题的迭代,但是由于它将一些问题合并为一个较大的问题,因此提出了独特的挑战。

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

当加载用户对象时(例如,用$this->getUser(){{ app.user }}表示),UserExtra数据也通过联接加载。拥有两个实体的全部目的是,我不必一次加载所有数据。

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

有没有解决的办法?

最佳答案

有许多解决方案可以解决您的问题:

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

2)在findfindAll等函数中,OneToOne的反面会自动加入(总是像获取EAGER一样)。但是在DQL中,它不能像获取EAGER那样工作,并且会花费额外的查询。可能的解决方案是每次与逆向实体联接

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

4)将反面更改为OneToMany-看起来很错误,可能是一个临时解决方法。

5)强制局部对象。没有其他查询,也没有延迟加载:$query->setHint (Query::HINT_FORCE_PARTIAL_LOAD, true)-向我提出了唯一可能的解决方案,但并非没有代价:
部分对象有一点风险,因为您的实体行为不正常。例如,如果您未在->select()中指定要使用的所有关联,则可能会出错,因为您的对象将不完整,所有未明确选择的关联都将为null

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

这个问题可能会对您有帮助:one to one relation load

关于symfony - 使用与外键共享的主键以一对一关系建立用户对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35710172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com