相关疑难解决方法(0)

Doctrine2一对一关系自动加载查询

我有一个看起来像这样的查询:

我的用户实体具有一对一的关系,如下所示:

/**
 * @var UserProfile
 *
 * @ORM\OneToOne(targetEntity="UserProfile",mappedBy="user")
 */
private $userProfile;
Run Code Online (Sandbox Code Playgroud)

每当我进行查询以选择多个用户对象时,它会为每个用户创建一个额外的select语句来查询UserProfile数据,即使我没有通过get方法访问它.我并不总是需要UserProfile数据,我当然不希望每次显示用户列表时都加载这些数据.

知道为什么这些查询在运行时执行?

doctrine-orm

33
推荐指数
3
解决办法
1万
查看次数

拥有side作为连接列的主键

注意: 主题冗长但详细,如果您使用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.

问题描述如下:

这里描述的建议解决方案:

所以有三种方法:

  1. 等等,看看是否在Doctrine中解决了提议的解决方案,并在将来的版本中修复(可能不会发生)
  2. 手动将每个查询中的UserData加入User(仍然浪费资源,不需要UserData)
  3. 切换反面并使用户拥有自己的一面.

我决定和#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,因为它们总是具有相同的值吗?你认为这种做事有任何潜在的问题吗?

关于这个问题的任何其他提示或意见都非常受欢迎和赞赏.

symfony doctrine-orm

22
推荐指数
2
解决办法
5326
查看次数

标签 统计

doctrine-orm ×2

symfony ×1