我得到了 2 个实体用户和配置文件。用户类代码:
/**
* @var Profile
*
* @ORMOneToOne(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
*
* @ORMOneToOne(targetEntity="User", mappedBy="profile")
* @ORMJoinColumn(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;
}
现在,在配置文件实体中的数据库中,我有user_id,在用户实体中,我有profile_id,但是当我在用户实体中添加配置文件时,profile_id为空。在配置文件类中user_id是可以的,但在用户profile_id中设置为空,有人可以帮助我吗?
正如前面的回答者所说 - 你不应该同时设置它。所以决定你想要哪一边。
一对一关系基本上是相同的一对多关系,唯一的区别是在"映射"侧,条目不能超过一次。
您那里有 2 个选项。将配置文件设置为用户或将用户设置为配置文件。
1(如果在开始时创建用户然后创建配置文件 - 您应该将二传手/getter放在配置文件侧
2(如果一开始你先创建配置文件,然后创建用户,你应该在用户端放置二传手/getter。
你不需要在一对一关系中映射/反转...
检查以下工作代码示例。(所以我们将在配置文件实体端放置二传手/getter(
/**
* One Profile has One User.
* @ORMOneToOne(targetEntity="User")
* @ORMJoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
public function setUser(User $user)
{
$this->user = $user;
}
public function getUser()
{
return $this->user();
}
附言。总的来说,我认为你试图通过这种关系使一些简单的事情变得困难。为什么不只创建一个实体?为什么这里需要两个一对一的关系?
你不应该在两边都设置它 - 因为Profile
已经inversedBy
它是拥有方 - 因此结果在你的数据库中。
您的 getter 和 setter 仍然可以正常工作 - user_id
注释上的JoinColumn
正在处理关系,profile_id
实际上并没有在任何地方指定,并且在您的数据库中是多余的。