Symfony 以更好的方式保持一对一的双向关系


Symfony Persisting oneToOne bidirectional relationship in a better way

我有 2 个实体

  1. 用户
  2. 求职者简介

它们以一对一双向方式设置

User.orm.yml

oneToOne:
    jobSeekerProfile:
        targetEntity: AppBundle'Entity'JobSeekerProfile
        mappedBy: jobSeekerUser
        cascade:  ["persist"]

JobSeekerProfile.orm.yml

oneToOne:
    jobSeekerUser:
        targetEntity: AppBundle'Entity'User
        inversedBy: jobSeekerProfile

场景 1

现在在我的控制器中,我正在尝试保存关系的反面,数据被保存,但不保存关系 ID。

if ($form->isValid()) {
    $user = $form->getData();
    // encode the password manually
    $encodedPassword = $this->get('security.password_encoder')->encodePassword($user, $form->get('plainPassword')->getData());
    $user->setPassword($encodedPassword);
    $em = $this->getDoctrine()->getManager();
    $em->persist($user);
    $em->flush();
    $this->get('session')->getFlashBag()->add(
        'success',
        $this->get('translator')->trans('success_registration')
    );
    return $this->redirect($this->generateUrl('login'));
}

场景 2

如果我将控制器更改为以下内容,则关系 ID 将被保存。 但随后将 2 条记录添加到表中,一条带有关系 ID,另一条没有关系 ID。

if ($form->isValid()) {
    $user = $form->getData();
    // encode the password manually
    $encodedPassword = $this->get('security.password_encoder')->encodePassword($user, $form->get('plainPassword')->getData());
    $user->setPassword($encodedPassword);
    $em = $this->getDoctrine()->getManager();
    $JS = new JobSeekerProfile();
    $JS->setFirstName($form->get('jobSeekerProfile')['firstName']->getData());
    $JS->setLastName($form->get('jobSeekerProfile')['lastName']->getData());
    $JS->setJobSeekerUser($user);
    $em->persist($user);
    $em->persist($JS);
    $em->flush();
    $this->get('session')->getFlashBag()->add(
        'success',
        $this->get('translator')->trans('success_registration')
    );
    return $this->redirect($this->generateUrl('login'));
}

我的问题是,关系 ID 不应该也使用 scenario 1 保存,因为其余数据正在保存,那么是什么阻止了关系 ID 也被保存?

我的问题2是,如果假设上述问题的答案是否定的,那么scenario 2是正确的方法,它可以完成工作,但它是symfony做事的方式吗?

我的物理能力告诉我,job_seeker_profile表中的user_id列为空。 这是对的吗?

如果是这样,那么最有可能的问题是你没有设置用户和求职者配置文件之间的关系。

class User {
  public function setJobSeekerProfile($profile) {
    $this->jobSeekerProfile = $profile;
    $profile->setUser($this); // THIS is what you are missing