Foxx
27.06.2013, 16:32:32
W jaki sposób w Symfony2 rozwiązuje się problem sortowania w przypadku encji połączonych relacją?
Konkretnie: mamy książki i katalogi w relacji jeden do wielu. Książki są przypisane do katalogów i chciałbym książki posortować w każdym katalogu inaczej.
Crozin
27.06.2013, 16:42:01
Symfony tego w żadnej sposób nie rozwiązuje, ponieważ Symfony ma niewiele wspólnego z bazami danych. Tym zajmuje się u Ciebie zapewne Doctrine. W DQL-u Doctrine'a za sortowanie odpowiada klauzura ORDER BY, dokładnie tak samo jak w SQL-u.
Ale wiesz, nie miałem na myśli tej części problemu sortowania, chodzi mi raczej o to, że nie wiem gdzie w opisanej sytuacji umieścić pole "position" skoro do dyspozycji mam tylko encje Ksiazka i Katalog, a chcę posortować dla każdego katalogu inaczej. W SF 1.x umieściłbym takie pole w tabeli relacyjnej przechowującej informacje o powiązaniach książek z katalogami, a w SF2 chyba nie ma takiej możliwości bo tabela relacyjna powstaje automatycznie, nie tworzę jej explicite.
Crozin
1.07.2013, 22:09:12
Jeżeli relacja zawiera jakieś dodatkowe dane (tutaj: pozycja) powinieneś skorzystać z podwójnej relacji jeden-do-wielu.
Czy masz na myśli OneToMany Bidirectional?
Korzystam z takiej relacji, ale nie wiem gdzie mógłbym tam umieścić dodatkową informację o pozycji. W takiej relacji tabela relacyjna tworzona jest automatycznie i wygląda to na pierwszy rzut oka tak, że nie mogę wpłynąć na jej kształt...
Crozin
1.07.2013, 22:45:54
Nie, pisałem o podwójnej relacji, a nie relacji dwukierunkowej. Chociaż obie relacje będą w tym przypadku dwukierunkowe.
Kod
Katalog (id, nazwa) <--> KatalogKsiązka (id, id_katalog, id_ksiązka, pozycja) <--> Książka (id, nazwa)
Czyli można powiedzieć, że dopóki tablica relacyjna służy tylko do przechowania informacji o relacji to mogę pozwolić żeby zajmował się nią automatycznie Doctrine/Symfony, a jeżeli chcę tam umieścić dodatkowe pola to samodzielnie tworzę encję, żeby móc wpływać na jej kształt?
Crozin
2.07.2013, 16:06:40
Dokładnie tak. W momencie, w którym potrzebujesz jakiś dodatkowych danych przy relacji pomiędzy encjami powinieneś zrezygnować z pojedynczej relacji ManyToMany na rzecz kombinacji ManyToOne + OneToMany z pośredniczącą encją pomiędzy.
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.