2014-04-11 1 views
0

OneToOne 관계와 관련된 엔티티가 2 개 있습니다. 반대쪽을 폼에 끼워 넣었습니다. 관계 사이의 링크가 저장되지 않는다는 것을 제외하면 모든 것이 잘 작동합니다. 그래서 : "Begeleider"가 저장되고 "CompetentieProfiel"테이블이 저장되지만 "CompetentieProfiel"테이블의 "Begeleider"를 참조하는 열은 null입니다.Symfony2 관계가 저장되지 않았습니다.

아쉽게도 flush()가 호출되면 "Begeleider"객체의 "CompetentieProfiel"객체가 변수로 사용됩니다.

연락처 :

class Contact { 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
} 

Begeleider :

class Begeleider extends Contact { 

    /** 
    * @ORM\OneToOne(targetEntity="CompetentieProfiel", mappedBy="begeleider" ,cascade={"persist"}) 
    */ 
    private $competentieProfiel; 
} 

CompetentieProfiel :

class CompetentieProfiel { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="Begeleider", inversedBy="competentieProfiel",cascade={"persist"}) 
    */ 
    protected $begeleider; 
} 

형태 :

class BegeleiderType extends AbstractType { 
/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
    ->add('competentieProfiel', new CompetentieProfielType()); 
} 
,

컨트롤러 :

public function createAction(Request $request) { 
    $entity = new Begeleider(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
    $em = $this->getDoctrine()->getManager(); 
    $em->persist($entity); 
    $em->flush(); 


    // Return the ok status and the begeleider html. 
    $response = new Response(
     json_encode(
     array(
      'status' => 'ok', 
     ) 
    ) 
    ); 
    $response->headers->set('Content-Type', 'application/json'); 

    return $response; 
} 

답변

1

한 쪽의 개체를 연결하는 동안 다른 쪽 개체와 연결하지 않습니다. 따라서 A는 B와 연관되어 있지만 B는 A와 관련이 없습니다.

가장 좋은 방법은 설정 객체에 체크를 추가하여 연관 객체를 설정하는 것입니다. BBBB

public function setAaaa(Aaaa $aaaa) 
{ 
    if (null === $aaaa->getBbbb() || $this !== $aaaa->getBbbb()) { 
     $aaaa->setBbbb($this); 
    } 

    $this->aaaa = $aaaa; 

    return $this; 
} 

에서 AAAA

public function setBbbb(Bbbb $bbbb) 
{ 
    if (null === $bbbb->getAaaa() || $this !== $bbbb->getAaaa()) { 
     $bbbb->setAaaa($this); 
    } 

    $this->bbbb = $bbbb; 

    return $this; 
} 

에서

측면 중 하나가 설정된 후, 다른 쪽이도 자동 설정이 방법.