Właściwy sposób aktualizacji dwukierunkowej relacji Wiele do Wielu symfony2-doktryna
Zrobiłem kilka badań i po przeczytaniuto ito (i wszystkie związane z tym pytania) Nadal nie mogę się zorientować, jaki jest właściwy sposób aktualizacji relacji wielu do wielu w Symonfy 2 Doctrine. Uważa, że powinien istnieć bardzo prosty sposób na zrobienie tego, czego wciąż nie znalazłem.
Mam te 2 podmioty:
class student_main
{
/**
* @ORM\ManyToMany(targetEntity="support_log", inversedBy="student_main")
* @ORM\JoinTable(name="support_log_student")
**/
private $support_log;
i
class support_log
{
/**
* @ORM\ManyToMany(targetEntity="student_main", mappedBy="support_log")
**/
private $student;
Chcę zacząć odsupport_log
. W kontrolerze w akcji aktualizacji mam coś takiego:
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)));
}
Oczywiście, jak mówi doktryna Dokumentacja, zmieniłem tę funkcję (addstudent_main) odpowiednio:
public function addstudent_main(student_main $student)
{
$student->addsupport_log($this); // the important addition
$this->student[] = $student;
}
To działa dobrze, moje pytanie dotyczy raczej usunięcia relacji. W formularzu jest wybór wielokrotny, a użytkownik może wybrać uczniów, którzy są już powiązani, a niektórzy nie. Uważa, że powinien to być automatyczny sposób, ale zamiast tego musiałem zrobić dużo kodu.
W kontrolerze, nieco powyżej kodu, który napisałem wcześniej:
//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();
}
Usuwam wszystkie relacje danego podmiotu (oczywiście biorąc pod uwagę, że jest to relacja dwukierunkowa, więc musi zostać usunięta najpierw po drugiej stronie), a następnie te, które wybrany użytkownik zostanie dodany.
Są na to inne sposoby, ale nie znalazłem żadnego prostego. We wszystkich mam te same problemy:
Muszę cały czas sprawdzać, czy związek istnieje, czy nieMuszę uzyskać stare relacje (co jest trudne) i porównać je z nowymi, które wskazał użytkownik, i odpowiednio je usunąć lub utworzyćCzy istnieje sposób, aby automatycznie rozwiązać te 2 problemy? (Mam silne przeczucie, że musi być - może z lepszą deklaracją związku? - dlatego pytam).
Z góry dziękuję
Edytuj: Mój formularz nie ma nic specjalnego, myślę, że nawet nie dotknąłem wygenerowanego kodu. Wyświetla multiselect, którego chcę, domyślny Symfony2, w którym musisz użyćctrl klawisz, aby wybrać więcej niż jeden. Oto kod:
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('student')
...
;
}
Klucz polega tutaj?