5

Mam następującą sytuację bazy danych:Doctrine 2.1 - jednostka mapa do wielu tabel

wp_users (user table generated by wordpress) 
ID | user_login | ... 

wp_sp_user (extension to the wp_users table) 
ID (FK) | surname | address | ... 

Teraz mam już próbuje na wiele godzin do „bezpiecznik” te dwie tabele w jeden User podmiotu, np:

class User { 
    var ID; 
    var user_login; 
    var surname; 
    var address; 
    ... 
} 

Czy istnieje jakiś sposób, aby osiągnąć taką mapowanie bez modyfikowania tabeli wp_user (których nie chcę robić za aktualizowanie powodów)?

+0

http://stackoverflow.com/questions/18213381 jest związane –

Odpowiedz

15

Czasami refaktoryzacja bazy danych nie jest możliwa lub tabela ma własną "raison d'être". W takim przypadku możesz użyć dziedziczenia. Twoja klasa użytkownika może rozszerzyć Konto. Odwzoruj konto na wp_users i rozszerz je o tabelę wp_sp_user. Klasa użytkownika użyje kolumn dwóch tabel.

Oto dokumentacja doktryna:

http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html#class-table-inheritance

+2

@MrMuh Jest to poprawne i pomocne, a zaakceptowana odpowiedź jest niepoprawna/nieaktualna. Rozważ zaakceptowanie tej akceptowanej odpowiedzi. –

-5

To nie jest możliwe. To również nie ma sensu.

Będziesz musiał fizycznie scalić tabele w MySQL i utworzyć encję Doktryny dla tej tabeli. Jest to jedyny sposób na zapewnienie, że twoje dane są czyste i całkowicie znormalizowane.

Innym możliwym rozwiązaniem jest utworzenie jednej encji dla każdej tabeli i użycie obiektu biznesowego w celu połączenia wyników z każdej z nich. To wcale nie jest dobre rozwiązanie, ponieważ będziesz musiał obsługiwać ograniczenia na warstwie aplikacji, a podwoisz ilość uruchamianych zapytań.

+1

+1. Ponadto nie jest dobrym pomysłem posiadanie klasy, która hermetyzuje dane z kilku tabel bazy danych. Lepiej scalić tabele w jeden lub zaprojektować dwie klasy. W twoim obecnym podejściu jest to pewnego rodzaju "Rozbieżna zmiana" (http://sourcemaking.com/refactoring/divergent-change). Tak czy inaczej, prędzej czy później będziesz musiał to zmienić. – J0HN

+3

-1 Trzecia normalna forma faktycznie oznacza, że ​​możesz oddzielić dane w zależności od kontekstu. Możesz mieć 2 użytkowników tabel i dane użytkownika. Ale zgodnie z trzecią normalną formą dane użytkownika muszą być podzielone na dane adresowe (ulica, miasto, kraj), dane osobowe (płeć, wzrost, wiek, dochód, no_children), dane kontaktowe (phone_no, PoBox) i tak dalej. Doktryna wciąż jest słabą ORM-ami, jest daleko w tyle za tymi, które zaimplementowały inne dojrzałe języki. Jako przykład nawet dzisiaj nie ma pełnego wsparcia dla obiektów wartości DDD (lub zbiorów VO). Twoja odpowiedź brzmiała w '11 :) – Tudor

+1

"To nie jest możliwe, ale nie ma sensu tego robić." To jest niepoprawne. (Być może było to prawdą w Doctrine 1?). Link w odpowiedzi @ tlmak0 wyraźnie pokazuje, że jest to możliwe. I OP przedstawił scenariusz, w którym myślę, że sensownie byłoby zachować dwie tabele oddzielnie, ponieważ przechowują logicznie różne zestawy informacji (być może byłby przypadek, w którym chcesz przypisać użytkownika do innego konta WP?) i mądrze byłoby nie łączyć ich w interesie zachowania struktury DB WordPressa. –

Powiązane problemy