2014-03-04 1 views
0

설정 엔티티와 관련된 제품 엔티티와 일대일 관계가 있습니다. 모든 제품을 가져오고 제품 시작시 설정 테이블에 관련 행이 없습니다.Symfony2 OneToOne 주석 삽입/업데이트 관련 엔티티

Symfony를 사용하여 제품을 업데이트 할 때 적절한 관계가 만들어 지므로 제품과 설정간에 OneToOne이 생깁니다. 내가 설정 테이블에 대한 또 다른 삽입이 제품을 다음 번에 업데이트하려고하면 불행하게도

$em->merge($product); 
$em->flush(); 

이 삽입 주석 및 방법에 관한 심포니 입어보기 자동 만들어

INSERT INTO settings (id_product, setting_1, setting_3, setting_3) VALUES (11153, '0', '1', '1'); 

이 간단한 INSERT 문을 사용하여 수행됩니다 id_product가 PK이고 고유해야하기 때문에 분명하고 오류가 있습니다. Product와 Setting 사이에 관계가있을 경우 Symfony가 INSERT 대신 UPDATE를하도록하려면 어떻게해야합니까? Symfony의 최신 버전을 사용하여 음악을 만듭니다.

+0

당신이 어떻게 업데이트하는에 코드를 게시 할 수 있습니다 설정 엔티티? 일반적으로 $ product-> getSetting() -> setSomeVar ('foobar')는 새로운 것을 생성하는 것이 아니라 설정 엔티티를 업데이트해야합니다 ... – Matt

+0

제가 게시합니다 - 병합 메소드를보십시오. 그것이 도달했을 때 automaticaly 업데이트 (항상 새로운 삽입 - 문제) annotations 덕분에 엔티티 설정 ... –

+0

나는 annotations, cascades, merge v persist 등의 사용에 대한 더 많은 정보가 필요하다고 생각한다. IME, 나는 병합만을 사용했다. 엔티티 관리자로부터 분리 된 엔티티를 관리합니다. merge() 대신 persist()를 사용하면 어떻게됩니까? – Matt

답변

1

엔티티를 만드는 것과 같은 방식으로 업데이트가 수행되지 않습니다. 다음은 아주 간단한 예는 (당신이 몇 가지 예외 등을 처리해야 할 것입니다 ..하지만 코드가 당신에게 차이를 보여 '짧은'이다 : 당신의 작업을 생성, 새 개체 작업을 만들 때

1

public function newAction(Request $request) 
    { 
     // create a task and give it some dummy data for this example 
     $task = new Task(); 
     $task->setTask('Write a blog post'); 
     $task->setDueDate(new \DateTime('tomorrow')); 

     $form = $this->createFormBuilder($task) 
      ->add('task', 'text') 
      ->add('dueDate', 'date') 
      ->add('save', 'submit') 
      ->getForm(); 

     if ($request->isMethod('POST')) { 
      $form->bind($request); 

      if ($form->isValid()) { 

       // perform some action, such as saving the task to the database 
       $em = $this->getDoctrine()->getManager(); 
       $em->persist($task); 
       $em->flush(); 

       return $this->redirect($this->generateUrl('task_success')); 
      } 
     } 

     return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 
:. 만들기를 당신이 작업을 업데이트 할 때, 먼저 데이터베이스에서 해당 작업을 인출 한 후 데이터베이스에 저장

2 데이터베이스에 저장

16,

업데이트 :

public function updateAction(Request $request, $taskId) 
    { 
     // get the task 
     $task = $this->getDoctrine() 
      ->getRepository('AcmeTaskBundle:Task'); 
      ->find($taskId); 

     $form = $this->createFormBuilder($task) 
      ->add('task', 'text') 
      ->add('dueDate', 'date') 
      ->add('save', 'submit') 
      ->getForm(); 

     if ($request->isMethod('POST')) { 
      $form->bind($request); 

      if ($form->isValid()) { 

       // update the task 
       $em->flush(); 

       return $this->redirect($this->generateUrl('task_success')); 
      } 
     } 

     return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 

난 당신이 체크 아웃하는 것이 좋습니다 것 :

+0

오늘 나중에 테스트 해 보겠습니다. 문제는 Product 엔티티가 DB에 있고 설정이 시작되지 않았다는 것입니다.이 문제를 처리하기 위해 일부 로직을 구현해야합니다. –