私はいくつかの調査を行いましたが、これとこれ(および関連するすべての質問) を読んだ後でも、Symonfy 2 Doctrine で多対多の関係を更新する適切な方法はどれかわかりません。私がまだ見つけていない非常に簡単な方法があるはずだと感じています。
私はこの2つのエンティティを持っています:
class student_main
{
/**
* @ORM\ManyToMany(targetEntity="support_log", inversedBy="student_main")
* @ORM\JoinTable(name="support_log_student")
**/
private $support_log;
と
class support_log
{
/**
* @ORM\ManyToMany(targetEntity="student_main", mappedBy="support_log")
**/
private $student;
から始めたいsupport_log
。コントローラーの更新アクションには、次のようなものがあります。
if ($editForm->isValid()) {
//add the relationship the user added
foreach($students as $student){
if(!$em->getRepository('mybundle:student_main')->hasSupportLog($entity,$student)){
$entity->addstudent_main($student);//*
}
}
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('support_log_edit', array('id' => $id)));
}
もちろん、doctrine Documentation が言うように、それに応じてその関数 (addstudent_main) を変更しました:
public function addstudent_main(student_main $student)
{
$student->addsupport_log($this); // the important addition
$this->student[] = $student;
}
これは問題なく機能します。私の質問は、関係の削除に関するものです。フォームには複数選択があり、ユーザーはすでに関連付けられている学生とそうでない学生を選択する場合があります。それを自動的に行う方法があるはずですが、代わりに多くのコードを実行する必要がありました。
コントローラーでは、前に書いたコードの少し上に、次のように記述しました。
//delete all old relationship
foreach($idsldstudents as $idst){ //I take Id's because the doctrine collection is updating always..
$stu=$em->getRepository('MyBundle:student_main')->find($idst);
$stu->deletesupport_log($entity);//I had to create that method (in the entity, I do "$this->support_log->removeElement($support_log)")
$em->persist($stu);
$em->flush();
}
問題のエンティティのすべての関係を削除します (もちろん、これは双方向の関係であるため、最初に反対側で削除する必要があることに注意してください)。次に、ユーザーが選択した関係が追加されます。
それを行う方法は他にもありますが、簡単な方法は見つかりませんでした。それらのすべてで、私は同じ問題を抱えています:
- 関係が存在するかどうかを常に確認する必要があります
- 古い関係を取得し (これは難しい)、ユーザーが示した新しい関係と比較し、それに応じて削除または作成する必要があります
これら2つの問題を自動的に処理する方法はありますか? (関係をより適切に宣言する必要があるに違いないと強く感じています-それが私が尋ねている理由です)。
前もって感謝します
編集:私のフォームには特別なものは何もありません。生成されたコードに触れていないと思います。ctrl複数選択するには、キーを使用する必要がある Symfony2 のデフォルトである、必要な複数選択が表示されます。コードは次のとおりです。
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('student')
...
;
}
鍵はここにかかっていますか?