我正在使用Symfony2.0.18 / Doctrine来实现一个函数。
有两个表“student”和“teacher”,其中的用户名必须是唯一的。 他们也是多对多的关系。 我想做的是让学生添加/删除教师。 如果教师已经存在,只需在关系表“student_2_teacher”中插入一个条目。
我为“老师”和“学生”以及“StudentController.php”创建了实体。 如果教师不退出$ student-> addTeacher($ teacher),它可以正常工作; 但如果老师存在,我总会得到唯一的错误。
PS:我怎样才能确保老师和学生之间的关系得到保存?
有人可以给我一些建议吗? 非常感谢!
答案 0 :(得分:0)
我明白了!
“表单集合”是不必要的。 有两件事需要考虑。
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;
}
}