2014-03-04 44 views
0

我有与一对一关系的设置实体相关的产品实体。所有产品均为进口产品,开始时产品在设置表中没有相关行。Symfony2 OneToOne注解插入/更新相关实体

使用Symfony更新产品时,会创建适当的关系,因此我在Product和Setting之间设置了OneToOne。

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

该刀片通过Symfony的感谢注释和方法automaticaly提出:

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

不幸的是,当我尝试下一次更新产品的另一插入到设置表这是使用简单的INSERT语句来完成完成,显然我有和错误becouse id_product是PK,必须是唯一的。如果产品和设置之间存在关系,我应该如何强制Symfony执行UPDATE而不是INSERT?我使用最新版本的Symfony创作我的音乐。

+0

你能后的代码,你如何更新设置实体?通常情况下,$ product-> getSetting() - > setSomeVar('foobar')应该更新设置实体,而不是创建一个新的... – Matt

+0

我发布它 - 看看合并方法。当它达到它自动更新(总是新的插入 - 问题)设置实体感谢注释... –

+0

我仍然认为我们需要更多的信息注释,级联,使用合并V坚持等IME,我只使用合并管理已经脱离实体经理的实体。如果使用persist()而不是merge(),会发生什么? – Matt

回答

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

更新:

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

我会在今天晚些时候测试它。问题是产品实体存在于数据库中,并且设置不在开始处......看起来我必须实现一些逻辑来处理这个问题。 –