Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony2][SF][SF2] Problem z zapisaniem relacji ManyToOne
Forum PHP.pl > Forum > PHP > Frameworki
Foxx
Używam Bundla SonataAdmin, mam 2 encje, Product i Category, a w nich

Product:
  1. /**
  2. * @ORM\OneToMany(targetEntity="Category", mappedBy="product", cascade={"persist"})
  3. */
  4. protected $categories;


Category:
  1. /**
  2.  * @ORM\ManyToOne(targetEntity="Product", inversedBy="categories", cascade={"persist"})
  3.  * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
  4.  */
  5. protected $product;


W ProductAdmin.php gdy użyję podstawowego typu pola obsługującego tę relację:
  1. ->add('categories')


Wyświetla się bardzo ładny jQuerowy multiple select w postaci tagów reprezentujacych produkt (z krzyżykiem do usuwania).
Problem w tym, że gdy się tam doda/usunie produkty to po zapisaniu zmiany nie są zachowane. Walidacja przechodzi mimo, że to jest pole wymagane. Czy coś jeszcze powinienem dodać w konfiguracji encji żeby ta relacja została zapisana?
usb2.0
ja zawsze to pisalem w tym stylu i problemow nie mialem
  1. ->add('cateogries','entity',array(
  2. 'class' => 'bundle:klasa',
  3. 'property' => 'pole'
  4. ))


i nigdy nie uzywam cascade ale to male ma znaczenie raczej
Foxx
Tylko, tak jak pisałem, używam SonataAdminBundle i o ile wiem to sonata używa defaultowo jednego ze swoich typów, chyba sonata_type_model i sobie mapuje klasę samodzielnie. W każdym razie zmiana na entity nie pomogła niestety. Przypuszczam, że czegoś mi brakuje w klasie encji...
usb2.0
zapewne wygenerowales gety i sety nie?
pyro
A co to w ogóle za bezsens logiczny? Kategoria może być użyta tylko i wyłącznie raz?

W owocach może być pomarańcza, ale grejfrut już nie wink.gif ?
Foxx
smile.gif Napisałem ten przykład analogicznie do mojego prawdziwego kodu żeby nie musieć tłumaczyć czym co jest, faktycznie niefortunnie. Załóżmy jednorazowość kategorii.

Co do getterów i setterów to mam to, co generuje polecenie doctrine:generate:entities czyli w tym przypadku getter i adder:

  1. public function addCategory(\Acme\FrontendBundle\Entity\Category $categories)
  2. {
  3. $this->categories[] = $categories;
  4.  
  5. return $this;
  6. }


Po dotychczasowym researchu widzę, że jest jakiś problem z setterem, ale nigdzie żadnego konkretnego wyjaśnienia nie widzę. Nie rozumiem dlaczego ten bundle udostępnia taki typ pola, ale nie jest ono obsługiwane...
pyro
No to strzelając w ciemno powinno być prawdopodobnie coś takiego:

  1. public function addCategory(\Acme\FrontendBundle\Entity\Category $categories)
  2. {
  3. $this->categories[] = $categories;
  4. $categories->setProduct($this);
  5.  
  6. return $this;
  7. }


Zadajesz wiele pytań na temat Sf2 / ORM, a czytałeś w ogóle ich dokumentację? Bo sporo z tych rzeczy zdaje się tam wyjaśnione.
Foxx
Dodanie $categories->setProduct($this); pomogło, przy jednoczesnym ustawieniu by_reference na false.
Czytam dokumentację, pytam gdy nie znajduję rozwiązania. Moje tematy nie zawsze kończą się odesłaniem do manuala smile.gif
Sporo tego jest do czytania, zdarza się coś przegapić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.