Doctrine 2 OneToOne,仅在必要时加载拥有方

时间:2015-07-18 16:35:51

标签: php doctrine-orm

我有两个实体 - 用户和用户设置。在用户实体中,我想将UserSettings作为属性。那没关系,我会添加一个OneToOne关系,但是有一个问题 - 因为UserSettings是关系的拥有方,每次加载User实体时,Doctrine也必须加载UserSettings实体。

有没有办法加载用户而不是UserSettings?

我做了一个奇怪的解决方案 - 这些实体之间没有关系,设置是通过Facade的方法加载的。例如:

/**
 * @ORM\Entity
 */
class User
{

  /**
   * @ORM\Column(type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue
   */
  private $id;

  /**
   * @ORM\Column(type="string")
   */
  private $name;

  /** @var UserSettings */
  private $settings;

  public function __construct()
  {
    $this->settings = new UserSettings();
  }


  public function setSettings(UserSettings $settings)
  {
    $this->settings = $settings;
  }

}

/**
 * @ORM\Entity
 */
class UserSettings
{

  /**
   * @ORM\Column(type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue
   */
  private $id;

  /**
   * @ORM\Column(name="user_id", type="integer")
   */
  private $userId;

}

class UserFacade
{

  /**
   * @var EntityManager
   */
  private $em;   // is injected automatically by DI

  public function loadSettings(User $user)
  {
    $settings = $this->em->getRepository("UserSettings")->findOneBy(array("userId" => $user->id));
    $user->setSettings($settings);
  }

}

$user = $em->find("User", 1);

// if I want user's settings
$userFacade->loadSettings($user);  // now I can use  $user->getSettings()->something;

附注:UserFacade是一个服务类,用于处理用户的数据,如添加新用户,编辑,删除等。在我的MVC应用程序中,控制器类与Facade通信,而不是直接与EntityManager通信。

没关系 - 只有在我想要的时候才会加载设置。但是,有两个可能的问题:

a)我认为这不是一个明确的方式

b)当我想要一个用户列表时,我无法加入设置所在的表,因为实体没有关联,所以我必须为每个用户创建一个额外的SQL。

我的问题是 - 如何用OneToOne关系解决问题?我对Doctrine没有多少经验,所以这可能是一个愚蠢的问题 - 对不起。

谢谢!

0 个答案:

没有答案