1

関数を実装するために Symfony2.0.18/Doctrine を使用しています。

「学生」と「教師」の 2 つのテーブルがあり、それぞれのユーザー名は一意である必要があります。それらは多対多の関係でもあります。私がやりたいことは、生徒が教師を追加/削除できるようにすることです。教師が既に存在する場合は、関係テーブル「student_2_teacher」にエントリを挿入するだけです。

「教師」と「学生」のエンティティ、および「StudentController.php」を作成しました。教師が $student->addTeacher($teacher); で終了しなければ問題ありません。しかし、先生が存在する場合は、常に固有のエラーが発生します。

PS: 教師と生徒の関係が確実に保存されるようにするにはどうすればよいですか?

誰かアドバイスをくれませんか?どうもありがとう!

4

3 に答える 3

0

わかった!

「フォームコレクション」は不要です。考慮しなければならないことが 2 つあります。

  1. 教師のユーザー名は一意であるため、最初に確認する必要があります。教師のユーザー名が既に存在する場合は、「addTeacher($teacherOld)」との関係を追加するだけです。存在しない場合は、「addTeacher($teacher)」を使用して追加します。
  2. $student->addTeacher($teacher); で教師と生徒の関係を保存します。

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()));}

于 2013-02-08T12:35:34.657 に答える
0

参考までに、関係の所有側と逆側は常に自分で処理する必要があります。ロジックはかなり単純で、https : //gist.github.com/Ocramius/3121916 の要点から抽出しました。

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

    $this->teachers->add($teacher);
}
于 2013-02-14T01:49:46.633 に答える
-1

教師が学生エンティティに存在するかどうかを確認する必要があります。

Student エンティティ クラス メソッド addTeacher で:

public function addTeacher($teacher)
{
    if (!in_array($teacher, $this->teachers->toArray())) {
        $this->teachers[] = $teacher;
    }
}
于 2013-02-08T08:18:36.110 に答える