Mam klasę User. User może być typu Hospital lub Doctor. Hospitals są powiązane z Doctors relacją ManyToMany. Klasa user wygląda tak:
*/ class User extends BaseUser { /** * @ORM\ManyToMany(targetEntity="User", mappedBy="myDoctors", cascade={"remove", "persist"}) **/ protected $myHospitals; /** * @ORM\ManyToMany(targetEntity="User", inversedBy="myHospitals", cascade = {"persist", "remove"}) * @ORM\JoinTable(name="hospital_doctor", * joinColumns={@ORM\JoinColumn(name="hospital_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="doctor_id", referencedColumnName="id")} * ) **/ private $myDoctors; //... }
Mam też formularz, w którym wyświetlam dane Doctora do edycji i teraz chciałem dodać pole, które umożliwi mu wybór szpitali:
$builder ->add('email') 'class' => 'DoctorsUserBundle:User', 'empty_value' => 'Not connected with hospital', 'empty_data' => null, 'required' => false, 'expanded' => true, 'label' => 'My hospital', 'query_builder' => function(EntityRepository $er) { return $er->createQueryBuilder('u') ->leftJoin('u.hospitalData', 'hd') ->where('hd.name != :name') ->setParameter('name', '') ->orderBy('hd.name', 'ASC'); }, )) ; // ...
W efekcie dostaję prawidłowo wyglądający formularz, szpitale są wyświetlone jako checkboxy, ale gdy je zaznaczam to te zmiany się nie zapisują. Jednocześnie pole "email" zapisuje zmiany i działa prawidłowo. Nie dostaję żadnych komunikatów. Ten sam problem miałem z inną encją w tym projekcie, która nie miała takiej relacji do samej siebie więc chyba robię coś nie tak za każdym razem. Kontroler zapisujący wygląda tak:
$editForm = $this->createForm(new UserType(), $user); $editForm->bind($request); if ($editForm->isValid()) { $em->persist($user); $em->flush(); //...
Będę wdzięczny za wskazanie co robię nie tak.