Отношение Symfony OneToOne не получает данные в пользовательской сущности - PullRequest
0 голосов
/ 01 мая 2018

Я получил 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;
}

Теперь в моей базе данных в сущности профиля у меня есть user_id, а в сущности пользователя у меня есть profile_id, но когда я добавляю профиль в сущности пользователя, profile_id имеет значение NULL. В классе профиля user_id это нормально, но в User profile_id установлено значение NULL, кто-то может мне помочь?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Как сказал предыдущий ответчик, вам не следует устанавливать его с обеих сторон. Так что решайте, в какую сторону вы хотите.

Отношение «один к одному» - это, по сути, одно и то же отношение «один ко многим», с той лишь разницей, что на «отображаемой» стороне запись не может быть более одного раза.

У вас есть 2 варианта там. Настройка профиля для пользователя или настройка пользователя для профиля.

1) Если при запуске вы создаете пользователей, а затем создаете профили - вы должны поместить сеттеры / геттеры в сторону профиля

2) Если при запуске вы создаете профили, а затем пользователей, вы должны разместить сеттеры / геттеры на стороне пользователя

Вам не нужно отображать / инвертировать в отношении oneToOne ...

Проверьте следующий пример рабочего кода. (Таким образом, мы разместим сеттеры / геттеры на стороне объекта профиля)

/**
 * 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();
}

пс. В целом, я думаю, вы пытаетесь сделать некоторые простые вещи с этим отношением. Почему бы просто не создать одну сущность? Зачем вам здесь два с одним к одному?

0 голосов
/ 01 мая 2018

Вы не должны устанавливать его с обеих сторон - так как Profile имеет inversedBy, это сторона-владелец - следовательно, результат в вашей базе данных.

Ваши геттеры и сеттеры по-прежнему будут работать нормально - аннотация JoinColumn на user_id заботится об отношениях, а profile_id фактически нигде не указывается и является излишней в вашей БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...