Symfony2多对多,具有独特的表格

Symfony2多对多,具有独特的表格,symfony,doctrine-orm,Symfony,Doctrine Orm,我正在使用Symfony2.0.18/Doctrine来实现一个函数 有两个表“student”和“teacher”,它们的用户名必须是唯一的。 他们也是多对多关系。 我想做的是让学生能够添加/删除教师。 如果教师已经存在,只需在关系表“student\u 2\u teacher”中插入一个条目即可 我已经为“教师”和“学生”创建了实体,并创建了一个“StudentController.php”。 如果教师没有使用$student->addTeacher($teacher)退出,则可以正常工作;

我正在使用Symfony2.0.18/Doctrine来实现一个函数

有两个表“student”和“teacher”,它们的用户名必须是唯一的。 他们也是多对多关系。 我想做的是让学生能够添加/删除教师。 如果教师已经存在,只需在关系表“student\u 2\u teacher”中插入一个条目即可

我已经为“教师”和“学生”创建了实体,并创建了一个“StudentController.php”。 如果教师没有使用$student->addTeacher($teacher)退出,则可以正常工作; 但是如果老师存在,我总是会得到唯一的错误

附言:我如何确保师生关系得以保存

有人能给我一些建议吗?
非常感谢

您需要检查学生实体中是否存在教师

在学生实体类方法addTeacher中:

public function addTeacher($teacher)
{
    if (!in_array($teacher, $this->teachers->toArray())) {
        $this->teachers[] = $teacher;
    }
}
我明白了

“表单集合”是不必要的。 有两件事必须考虑

  • 因为教师用户名是唯一的,所以必须首先检查它。如果教师用户名已经存在,只需添加与“addTeacher($teacherOld)”的关系,如果不存在,则使用“addTeacher($teacher)”添加关系
  • 使用$student->addTeacher($teacher)保存师生关系
    
    公共函数addAction(请求$Request){
    $student=$this->container->get('security.context')->getToken()->getstudent()

    $teacher=新教师(); $form=$this->createFormBuilder($teacher) ->添加('teacherUsername','text') ->getForm(); 如果($request->getMethod()=='POST'){ $form->bindRequest($request); 如果($form->isValid()){ $em=$this->getDoctrine()->getEntityManager(); $teacherUsername=$form->get('teacherUsername')->getData(); //检查教师用户名是否存在? $teacherOld=$this->getdoctor()->getRepository('PSEMainBundle:teacher')->findonebytechername($teacherUsername); 如果($teacherOld){ $student->addTeacher($teacherOld); }否则{ $teacher->settacherUserName($teacherUsername); $student->addTeacher($teacher); } //添加关系 $em->persist($student); $em->flush(); 返回$this->redirect($this->generateUrl(“教师”); } } 返回$this->render('PSEMainBundle:teacher:add.html.twig',array('form'=>$form->createView());}

    仅供参考,您应该始终自己处理关系的拥有方和反向方。逻辑相当简单,我从以下要点中提取:


    在您的问题中添加一些代码,例如如何在实体和表单中定义关系请参阅本食谱教程,谢谢,我将查看该教程。看起来有点复杂。谢谢。这样,我将只得到与学生关联的教师,而不是表中的所有教师,并且师生关系也不会被保存。 $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()));}
    public function addTeacher(Teacher $teacher)
    {
        if ($this->teachers->contains($teacher)) {
            return;
        }
    
        $this->teachers->add($teacher);
    }