Symfony2多对多具有独特的表格

时间:2013-02-08 08:10:38

标签: symfony doctrine-orm

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

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

我为“老师”和“学生”以及“StudentController.php”创建了实体。 如果教师不退出$ student-> addTeacher($ teacher),它可以正常工作; 但如果老师存在,我总会得到唯一的错误。

PS:我怎样才能确保老师和学生之间的关系得到保存?

有人可以给我一些建议吗? 非常感谢!

3 个答案:

答案 0 :(得分:0)

我明白了!

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

  1. 因为教师用户名是唯一的,所以必须先检查。如果教师用户名已经存在,只需添加“addTeacher($ teacherOld)”的关系,如果没有,请使用“addTeacher($ teacher)”
  2. 使用$ student-> addTeacher($ teacher);
  3. 保存教师和学生之间的关系

    public function addAction(Request $request) { $student = $this->container->get('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()));}
    

答案 1 :(得分:0)

仅为了您的信息,您应该始终自己处理关系的拥有和反面。逻辑非常简单,我从https://gist.github.com/Ocramius/3121916

的要点中提取出来
public function addTeacher(Teacher $teacher)
{
    if ($this->teachers->contains($teacher)) {
        return;
    }

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

答案 2 :(得分:-1)

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

在您的学生实体类方法addTeacher中:

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