2012-04-09 35 views
0

我的代碼有什麼問題?我想根據網址更新或插入Moteur對象。
提前致謝。嘗試更新或在Symfony2控制器中插入表格

/** 
* @Route("/moteur/{moteurid}", name="moteur", requirements={"moteurid" = "\d+"}, defaults={"moteurid" = null}) 
* @Template() 
* 
* Cette page permet d'enregistrer de nouveaux moteurs (et de les éditer). 
*/ 
public function moteurAction($moteurid) 
{ 
    $args=array(); 
    $avertissement = null; 
    if (!$this->get('security.context')->isGranted('ROLE_ADMIN')) 
    { 
     $avertissement = "Vous n'avez pas le droit d'accéder à cet espace."; 
     return $this->redirect($this->generateUrl('index', array('avertissement' => $avertissement))); 
    } 

    $args['menu']['admin'] = 'selected'; 
    $obj = null; 
    if ($moteurid == null) 
    { 
     $obj = new Moteur(); 
    } 
    else 
    { 
     $obj = $this->getDoctrine()->getRepository('CreasixtineAFBundle:Moteur')->find($moteurid); 
    } 
    $form = $this->createForm(new FormMoteur(), $obj); 
    $args['form'] = $form->createView(); 

    if ($this->getRequest()->getMethod() == 'POST') 
    { 
     $form->bindRequest($this->getRequest()); 

     if ($form->isValid()) 
     { 
      $obj = $form->getData(); // Type Moteur() 
      $pn = $obj->getPnid(); 

      $em = $this->getDoctrine()->getEntityManager(); 
      if ($moteurid == null) 
      { 
       $em->persist($obj); 
       $avertissement = "Moteur créé !"; 
      } 
      else 
      { 
       // Rien, le moteur sera mis à jour avec flush() 
       $avertissement = "Moteur mis à jour !"; 
      } 
      foreach ($pn as $my_pn){$em->persist($my_pn);} 
      $em->flush(); 

      return $this->redirect($this->generateUrl('admin', array('avertissement' => $avertissement))); 
     } 
     else 
     { 
      throw new Exception("Le formulaire n'est pas valide."); 
     } 
    } 

    $contenu = $this->rendu($args, "formulaire_moteur.html.twig"); 
    return $contenu; 
} 

回答

1

首先,PHP5引用本身傳遞對象,你並不需要這一行:

$obj = $form->getData(); // Type Moteur() 

然後,MOTEUR和Pn之間的關係是一個有點混亂。你用getPnid()得到一個Pn,但是你得到一個你想要堅持的對象?

無論如何,這些光合速率對象應該MOTEUR前繼續存在,因此這裏是我會寫:

if ($form->isValid()) 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 

    $pn = $obj->getPnid(); 

    //Persist these related objects BEFORE Moteur 
    foreach ($pn as $my_pn) 
    { 
     $em->persist($my_pn); 
    } 

    if ($moteurid == null) 
    { 
     $em->persist($obj); 
     $avertissement = "Moteur créé !"; 
    } 
    else 
    { 
     // Rien, le moteur sera mis à jour avec flush() 
     $avertissement = "Moteur mis à jour !"; 
    } 
    $em->flush(); 

    return $this->redirect($this->generateUrl('admin', array('avertissement' => $avertissement))); 
} 
else 
{ 
    throw new Exception("Le formulaire n'est pas valide."); 
} 
+0

非常感謝你! – Creasixtine 2012-04-24 07:49:55

+0

但是如果我想讓所有相關實體具有「cascade:[all]」?我不能這樣做,我得到「SQLSTATE [23000]:完整性約束違規:1062重複條目」。 – linuxatico 2012-06-18 14:37:56

相關問題