Symfony OneToOne关系不在用户实体中获取数据

时间:2018-05-01 15:05:59

标签: php symfony doctrine-orm

我有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,有人可以帮助我吗?

2 个答案:

答案 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)

你不应该在双方都设置它 - 因为ProfileinversedBy它是拥有者 - 因此结果在你的数据库中。

您的getter和setter仍然可以正常工作 - JoinColumn on user_id注释正在处理关系,profile_id实际上并未在任何地方指定,而且在您的数据库中是多余的。