2017-03-21 41 views
7

Potrzebuję pomocy z doktryną 2, która wykorzystuje "asocjacje polimorficzne". Pozwól mi wyjaśnić. Encje mogą obsługiwać załączniki plików przy użyciu podzbioru relacji polimorficznej. encja Plik służy do przechowywania tej relacji, gdy odniesienie do plików jest przechowywane jako zapisy w tabeli plików i ma polimorficzną relację do modelu nadrzędnego. Chcę utworzyć tę samą funkcjonalność co https://octobercms.com/docs/database/attachments Ale nie wiem, jak utworzyć relację i jak na przykład wstawić dynamiczny kod , taki jak attachment_id;Polimorficzne załączniki wykorzystujące podzbiór relacji polimorficznej w doktrynie 2

/** 
* @var \Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\OneToOne(targetEntity="App\Domain\FileAttachment\Entity\FileAttachment", attachment_type="news_thumbnail") 
*/ 
private $thumbnail; 


/** 
* @var \Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\OneToOne(targetEntity="App\Domain\FileAttachment\Entity\FileAttachment", attachment_type="news_image") 
*/ 
private $image; 

/** 
* @var \Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\OneToMany(targetEntity="App\Domain\FileAttachment\Entity\FileAttachment", attachment_type="news_files") 
*/ 
private $files; 

Przykładowa tabela plików.

An example of the files table

Odpowiedz

0

mam pewne doświadczenie, próbując uczynić pracę polimorfizmu (w tym plików polimorficznych) w symfony i przez ten czas myślę, że mogę podzielić się kilka moich spostrzeżeń z wami w nadziei, że będą one zapewnić Państwu kilka przydatnych informacji na ten temat.

Po pierwsze, proponuję lekturę dotyczącą mapowania dziedziczenia w doktrynie link. Przy pomocy mapowania dziedziczenia doktryny wystarczy utworzyć jedną główną klasę File, a następnie sprawić, by każdy inny załącznik ją rozszerzył. Następnie powiedz, że chcesz dodać załącznik graficzny do użytkownika. Po prostu utworzysz relację oneToOne między użytkownikiem a główną klasą File. Jeśli trwający załącznik jest instancją jednej z klas załączników, Doctrine jest na tyle sprytny, aby zwrócić obiekt z tej klasy, a nie główną klasę File.

Aby odpowiedzieć na twoje pytanie, dam ci konkretny przykład. Case:

  • ImageAttachment rozciąga FileAttachment
  • Użytkownik ma właściwość o nazwie zdjęcia
  • Zdjęcie oferty jest relacja OneToOne podmiotowi FileAttachment

Kod:

$image = new ImageAttachment(); 
$user->setPhoto($image); 

$em->persist($user); 
$em->flush(); 

Wynik:

Teraz w bazie danych w tabeli użytkownika, w kolumnie o nazwie coś photo_id odwołanie ID byłby jeden w tabeli FileAttachment. Kiedy zrobiłbyś $ user-> getPhoto(); zwrócił obiekt klasy ImageAttachment, ponieważ doktryna wie, że zachowałeś ImageAttachment, a nie tylko FileAttachment.


Jeśli chodzi o kolekcjach, rzeczy byłoby również bardzo proste. W takim przypadku prawdopodobnie będziesz musiał utworzyć relację ManyToMany między plikiem a encją, którą chcesz powiązać z plikiem. Załóżmy, że użytkownik może mieć wiele różnych typów załączników zapisanych w bazie danych.Jeśli chcesz użyć tej aplikacji systemu plików, prawdopodobnie nie ma sensu, aby plik wiedział o użytkowniku, do którego należy, ponieważ wkrótce plik musiałby przechowywać informacje o wszystkich różnych typach relacji, a to nie jest tylko inteligentna architektura wybór, jeśli chcesz mieć dowolny system modułowy. Właśnie dlatego moja sugestia polega na stosowaniu związków ManyToMany pomiędzy jakimś bytem a załącznikami. W ten sposób tylko użytkownik wiedziałby o plikach w bazie danych, a system plików byłby agnostyczny i oddzielony od niego.

Trzecim ważnym punktem, który należy poczynić, mówiąc o polimorfizmie w doktrynie, jest wsparcie symfonii dla tej cechy. Ogólnie polimorfizm jest uważany w niektórych przypadkach za złą praktykę, a szczególnie w przypadku uporczywości danych nie ma większego wsparcia w społeczności. Więc ważną rzeczą do rozważenia jest to, że Symfony CollectionType NIE MA WSPARCIA DLA POLIMORFIZMU, tak jak zawsze. Zasadniczo będziesz musiał napisać własny typ, jeśli planujesz używać polimorficznych kolekcji formularzy. Ale jeśli nie masz nic przeciwko używaniu odrobiny ajax, to nie jest to problem, możesz po prostu unikać używania formularzy SF tylko w tym celu.

Powiązane problemy