我有2个实体用户和个人资料。用户类代码:
/**
* @var Profile
*
* @ORM\OneToOne(targetEntity="Profile", inversedBy="user")
*/
private $profile;
/**
* @param Profile $profile
* @return $this
*/
public function setProfile($profile)
{
$this->profile = $profile;
return $this;
}
/**
* @return Profile
*/
public function getProfile()
{
return $this->profile;
}
个人资料类代码:
/**
* @var User
*
* @ORM\OneToOne(targetEntity="User", mappedBy="profile")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @param User $user
* @return $this
*/
public function setUser($user)
{
$this->user = $user;
return $this;
}
/**
* @return User
*/
public function getUser()
{
return $this->user;
}
现在我在Profile实体的数据库中已经获得了user_id,而在用户实体中我获得了profile_id,但是当我在用户实体中添加配置文件时,profile_id为NULL。在Profile类中,user_id没问题,但在用户profile_id中设置为NULL,有人可以帮助我吗?
答案 0 :(得分:1)
正如之前的回答者所说 - 你不应该在双方都设置它。因此,决定你想要哪一方。
一对一的关系基本上是一对多的关系,唯一的区别是在“映射”方面,条目不能超过一次。
你有2个选择。将配置文件设置为用户或将用户设置为配置文件。
1)如果在开始时创建用户然后创建配置文件 - 您应该在配置文件侧放置setter / getter
2)如果在开始时创建配置文件然后创建用户,则应在用户端放置setter / getter
您不需要在oneToOne关系中映射/反转...
检查以下工作代码示例。 (因此我们将在配置文件实体端放置setter / getter)
/**
* One Profile has One User.
* @ORM\OneToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
public function setUser(User $user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user();
}
PS。总的来说,我认为你正试图通过这种关系使一些简单的事情变得困难。为什么不创建一个实体?为什么你需要两个一对一的关系?
答案 1 :(得分:0)
你不应该在双方都设置它 - 因为Profile
有inversedBy
它是拥有者 - 因此结果在你的数据库中。
您的getter和setter仍然可以正常工作 - JoinColumn
on user_id
注释正在处理关系,profile_id
实际上并未在任何地方指定,而且在您的数据库中是多余的。