2013-03-20 141 views
1

我有一个审计表单,我可以附上几个资源(审计有很多资源,资源只附加到一个审计)。Symfony 2表单:实体构件与多对一/一对多关系 - 关系不坚持

表单在视图中很好地呈现,但是在保存表单时,所选的资源不会附加到数据库中的审计中。

审核表:

>add('ressources', 'entity', array(
      'class' => 'SpriMonitorBusinessBundle:Ressource', 
      'query_builder' => $this->em->getRepository('SpriMonitorBusinessBundle:Ressource')->getAvailableRessources(true), 
      'multiple'=>true 
    )) 

Audit.orm.yml:

oneToMany: 
    ressources: 
     targetEntity: Ressource 
     mappedBy: audit 

Ressource.orm.yml:

manyToOne: 
    audit: 
     targetEntity: Audit 
     inversedBy: ressources 
     joinColumn: 
     name: audit_id 
     referencedColumnName: id 

注:在的ressource形式时,我选择一个审核,它被正确保存

控制器:

public function newAction() 
    { 
     $em = $this->getDoctrine()->getEntityManager(); 
     $item = AuditFactory::make(); 
     $form = $this->createForm(new AuditType($em),$item); 

     $request = $this->get('request'); 
     $session = $this->get('session'); 

     if ('POST' == $request->getMethod()) { 
      try { 

       $this->validateForm($form,$request); 
       $em->persist($item); 
       $em->flush(); 
       $message = $this->container->getParameter('form_submit_success'); 
       $session->setFlash('success', $message); 
       $url = $this->generateUrl('Spri_audit_list'); 

       return $this->redirect($url); 

      } catch (FormException $e) { 
       $session->setFlash('error', sprintf('Erreur Formulaire : "%s"',$e->getMessage())); 
      } catch (\Exception $e) { 
       die(var_dump($e->getMessage())); 
       $session->setFlash('error', sprintf('Erreur inconnue ! Contactez l\'ADMIN'.$e->getMessage())); 
      } 
     } 

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

    protected function validateForm($form, $request) 
    { 
     $form->bind($request); 
     if (!$form->isValid()) { 
      $message = $this->container->getParameter('form_submit_error'); 
      throw new FormException($message); 
     } 
    } 

的var_dump($项目)显示:

private 'slug' => null 
    private 'ressources' => 
    object(Doctrine\Common\Collections\ArrayCollection)[4190] 
     private '_elements' => 
     array 
      0 => 
      object(Spri\MonitorBusinessBundle\Entity\Ressource)[3766] 
       ... 
    privat... 

任何想法?

+0

您可以将您的控制器发布到何处,并持续刷新实体管理器? – 2013-03-20 17:56:58

+0

@KenHannel:完成! – ProXamer 2013-03-20 17:59:38

+0

如果在持久化之前执行var_dump($ item),它是否显示Resources为children? – 2013-03-20 18:02:39

回答

0

好吧,我想我知道发生了什么事情。

public function newAction() 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 
    $item = AuditFactory::make(); 
    $form = $this->createForm(new AuditType($em),$item); 

    $request = $this->get('request'); 
    $session = $this->get('session'); 

    if ('POST' == $request->getMethod()) { 
     try { 

      $this->validateForm($form,$request); 

      $newItem = $form->getData(); 

      $em->persist($newItem); 
      $em->flush(); 
      $message = $this->container->getParameter('form_submit_success'); 
      $session->setFlash('success', $message); 
      $url = $this->generateUrl('Spri_audit_list'); 

      return $this->redirect($url); 

     } catch (FormException $e) { 
      $session->setFlash('error', sprintf('Erreur Formulaire : "%s"',$e->getMessage())); 
     } catch (\Exception $e) { 
      die(var_dump($e->getMessage())); 
      $session->setFlash('error', sprintf('Erreur inconnue ! Contactez l\'ADMIN'.$e->getMessage())); 
     } 
    } 

    return $this->render('SpriAuditBundle:Audit:new.html.twig', array('form'=>$form->createView())); 
} 
+0

我仍然有同样的结果。 – ProXamer 2013-03-20 18:13:35

+0

我能想到的最后一件事就是尝试向Ressource实体添加cascade persist。 – 2013-03-20 18:23:58

+0

我不明白你在想什么! – ProXamer 2013-03-20 18:25:09

1

必须设置在Ressource实体Audit实体手动编辑实体addRessource()方法:这个更新的控制器应解决您的问题。

只要编辑这个方法,如:

public function addRessource(Ressource $ressource) 
{ 
    $this->ressources[] = $ressource; 
    $ressource->setAudit($this); 

    return $this; 
} 

UPD

然后尝试在控制器手动坚持ressources:

foreach ($audit->getRessources() as $ressource) { 
    $em->persist($ressource); 
} 

UPD

好,奇怪。执行下一个代码片段并检查信源关系:

$em = $this->getDoctrine()->getManager(); 

$ressource = new Ressource(); 
$ressource->setSomeRequiredFieldValue($someValue); 

$audit = new Audit(); 
$audit->setSomeRequiredFieldValue($someValue); 
$audit->addRessource($ressource); 

$em->persist($audit); 
$em->persist($ressource); 
$em->flush(); 
+0

没有变化:(:( – ProXamer 2013-03-21 09:03:00

+1

您是否已经在模式中的审计实体的资源属性中添加了“cascade:[persist]”(不确定语法,我从来不使用模式文件) – 2013-03-21 09:08:34

+0

yes:oneToMany: ressources: targetEntity:的ressource 的mappedBy:审计 级联:“坚持”,“合并”] – ProXamer 2013-03-21 09:23:45