Obecnie opracowujemy bardzo elastyczną i modułową aplikację z Zend Framework 2 i Doctrine 2. W tej aplikacji znajduje się wiele jednostek Doctrine, na przykład powiedzmy jednostkę Product
w module Products
. Ten moduł Products
jest podstawowym/domyślnym modułem do zarządzania produktem.Zastępstwo Dziedziczenie doktryny
Chcemy być w stanie stworzyć niestandardowy moduł Products
dla klienta (XProducts
). Dlatego stworzyłem nowy podmiot, XProduct
(z kilkoma dodatkowymi polami), który rozciąga się na Product
.
Więc jeśli moduł niestandardowy jest włączony, chcę użyć XProduct
i jeszcze Product
, ale nigdy razem (w tym samym projekcie).
Jeśli dodaję dwie jednostki z @Entity, to działa częściowo; na przykład findAll
działa idealnie, ale find
nie działa: utworzona instrukcja SELECT zawiera poprawne kolumny, ale klauzula WHERE jest niepoprawna. Na przykład:
SELECT t1.id AS id2, t1.name AS name3 FROM products t1 WHERE t0.id = ?
Chyba t1
podpórek ProductX
i t0
dla Product
ale nie mogę zrozumieć, dlaczego kolumny są prawidłowe (t1
), ale gdy klauzula nie jest (t0
).
Jestem świadomy, że Doctrine zapewnia dziedziczenie pojedynczej tabeli w celu osiągnięcia dziedziczenia, dlatego konieczne jest posiadanie kolumny DiscriminatorColumn i zdefiniowanie DiscriminatorMap w jednostce podstawowej/domyślnej. To nam nie pasuje, ponieważ musimy zmienić nasz moduł podstawowy/domyślny, jeśli dodamy nowy moduł niestandardowy dla klienta (a tego nie chcemy ...).
Czy ktoś ma pojęcia, jak rozwiązać ten problem? Dzięki!
Próbuję tego samego podejścia, ale problem polega na tym, że klasa abstrakcji (AbstractProduct) nie może być używana w kwerendach DQL. Zgodnie z [podręcznikiem] (http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html) zmapowane klasy nadrzędne nie są zdolne do przetwarzania zapytań. Jak piszesz zapytania, które działają zarówno w produkcie, jak i w XProduct? – aimfeld