2013-02-08 37 views
1

我使用Symfony2.0.18/Doctrine來實現一個功能。Symfony2多對多有獨特的表格

有兩個表「學生」和「老師」,在他們的用戶名必須是唯一的。 他們也是多對多的關係。 我想要做的是讓學生添加/刪除教師。 如果教師已經存在,只需在關係表「student_2_teacher」中插入一個條目即可。

我創建實體兩個「老師」和「學生」和「StudentController.php」。 如果老師不以$ student-> addTeacher($ teacher)退出,那麼它工作正常; 但是,如果老師存在,我總是有唯一的錯誤。

PS:我怎麼能保證教師和學生之間的關係被保存?

有人可以給我一些建議嗎? 非常感謝!

+0

一些代碼添加到你的問題,怎麼樣,你定義在你的實體間關係,並形成 – sonam

+0

檢查出這個食譜教程,HTTP:// symfony.com/doc/current/cookbook/form/form_collections.html – sonam

+0

謝謝,我會檢查教程。這似乎有點複雜。 – Sifeng

回答

-1

您需要檢查,如果教師在學生的實體存在。

在你的學生的實體類方法addTeacher:

public function addTeacher($teacher) 
{ 
    if (!in_array($teacher, $this->teachers->toArray())) { 
     $this->teachers[] = $teacher; 
    } 
} 
+0

謝謝。通過這種方式,我只會得到老師,這些老師與學生相關,而不是全部老師。 – Sifeng

+0

而且師生關係也不會保存。 – Sifeng

0

我知道了!

「表單集合」是不必要的。 有兩件事情需要考慮。

  1. 因爲老師用戶名是獨一無二的,它必須首先檢查。如果教師的用戶名已經存在,只是增加了「addTeacher($ teacherOld)」的關係,如果沒有,使用「addTeacher($教師)」
  2. 保存$學生 - > addTeacher($教師)教師與學生之間的關係;

公共職能的addAction(請求$要求){$ 學生= $這個 - >容器 - >獲取( 'security.context') - >爲gettoken() - > getstudent();

$teacher = new teacher(); 
$form = $this->createFormBuilder($teacher) 
    ->add('teacherUsername', 'text') 
    ->getForm(); 

if($request->getMethod() == 'POST') { 
    $form->bindRequest($request); 
    if($form->isValid()) { 
     $em = $this->getDoctrine()->getEntityManager(); 
     $teacherUsername = $form->get('teacherUsername')->getData(); 

     // check teacherUsername exist? 
     $teacherOld = $this->getDoctrine()->getRepository('PSEMainBundle:teacher')->findOneByTeacherUsername($teacherUsername); 
     if ($teacherOld) { 
      $student->addTeacher($teacherOld); 
     } else { 
      $teacher->setTeacherUsername($teacherUsername); 
      $student->addTeacher($teacher); 
     } 

     // add relations 
     $em->persist($student); 
     $em->flush(); 

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

return $this->render('PSEMainBundle:teacher:add.html.twig', array('form' => $form->createView()));} 

0

只是爲了您的信息,你應該總是處理擁有你自己的關係和反側。其中的邏輯是相當簡單的,我提取它的要點在https://gist.github.com/Ocramius/3121916

public function addTeacher(Teacher $teacher) 
{ 
    if ($this->teachers->contains($teacher)) { 
     return; 
    } 

    $this->teachers->add($teacher); 
}