我有两个实体 - 用户和用户设置。在用户实体中,我想将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没有多少经验,所以这可能是一个愚蠢的问题 - 对不起。
谢谢!