Symfony以更好的方式坚持oneToOne双向关系

时间:2016-03-14 11:09:14

标签: php orm doctrine symfony

我有2个实体

  1. 用户
  2. jobSeekerProfile
  3. 并且它们是在oneToOne双向

    中设置的

    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条记录被添加到表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();
    
        $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'));
    
    }
    

    我的问题是,不应该使用scenario 1来保存关系ID,因为其他数据已经保存,所以最后是否会保存关系ID以保存?

    我的问题2是,如果假设上述问题的答案为否,那么scenario 2是正确的方法,它是否能完成这项工作,但这是一种做事的方式吗?

1 个答案:

答案 0 :(得分:1)

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

如果是这样,那么最可能的问题是您没有设置User和JobSeekerProfile之间的关系。

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