我有一个看起来像这样的查询:
我的用户实体具有一对一的关系,如下所示:
/**
* @var UserProfile
*
* @ORM\OneToOne(targetEntity="UserProfile",mappedBy="user")
*/
private $userProfile;
Run Code Online (Sandbox Code Playgroud)
每当我进行查询以选择多个用户对象时,它会为每个用户创建一个额外的select语句来查询UserProfile数据,即使我没有通过get方法访问它.我并不总是需要UserProfile数据,我当然不希望每次显示用户列表时都加载这些数据.
知道为什么这些查询在运行时执行?
注意: 主题冗长但详细,如果您使用Doctrine2和oneToOne关系,可能会派上用场.
最近我在学说中遇到了一个问题:
我使用oneToOne双向关系创建了User和UserData对象:
User:
...
oneToOne:
userdata:
targetEntity: UserData
mappedBy: user
UserData:
...
oneToOne:
user:
targetEntity: User
inversedBy: userdata
Run Code Online (Sandbox Code Playgroud)
所以UserData是拥有user_id列的拥有者:
user: id, ...
userdata: id, user_id, ...
Run Code Online (Sandbox Code Playgroud)
这就产生了一个问题,每次你获取一个User对象(单个用户,用户集合或其他对象的集合,用户加入它)时,Doctrine会为每个用户延迟加载一个UserObject.
问题描述如下:
这里描述的建议解决方案:
所以有三种方法:
我决定和#3一起去.所以我的架构关系现在看起来像这样:
User:
...
oneToOne:
userdata:
targetEntity: UserData
inversedBy: user
UserData:
...
oneToOne:
user:
targetEntity: User
mappedBy: userdata
Run Code Online (Sandbox Code Playgroud)
这意味着我的表现在看起来像这样:
user: id, userdata_id, ...
userdata: id, ...
Run Code Online (Sandbox Code Playgroud)
我决定不再使用Userdata.id自动增量,而是手动设置它并将其与user.id匹配.这意味着UserData.id将始终匹配user.id.
问题我可以使用user.id(主要自动增量密钥)作为joinColum而不是userdata_id,因为它们总是具有相同的值吗?你认为这种做事有任何潜在的问题吗?
关于这个问题的任何其他提示或意见都非常受欢迎和赞赏.