Wie erstelle ich traditionelle polymorphe Beziehungen mit Doctrine 2?
Ich habe eine Menge Antworten gelesen, die die Verwendung von Single Table Inheritance nahelegen, aber ich kann nicht sehen, wie dies in meiner Situation helfen würde. Hier ist, was ich versuche zu tun:
Ich habe einige nützliche Einheiten wie eine Adresse, eine E-Mail und eine Telefonnummer.
Ich habe einige "kontaktierbare" Entitäten, wie einen Kunden, Arbeitgeber, Unternehmen. Jeder von diesen sollte eine OneToMany-Beziehung mit den oben genannten Utility-Entities enthalten.
Idealerweise möchte ich eine abstrakte Basisklasse mit dem Namen 'ContactableEntity' erstellen, die diese Beziehungen enthält, aber ich weiß, dass es nicht möglich ist, OneToMany-Beziehungen in zugeordnete Superklassen mit Doktrin zu setzen - das ist in Ordnung.
Ich weiß jedoch immer noch nicht, wie ich diese ohne große Redundanz im Code in Beziehung setzen kann. Mache ich Adresse zu einem STI-Typ mit einer Unterklasse 'CustomerAddress', die die Beziehung direkt zu einem Kunden enthält? Gibt es keine Möglichkeit, die Anzahl der Wiederholungen zu reduzieren?
Warum nicht einfach Ihre Basis ContactableEntity konkret machen?
BEARBEITEN:
Habe gerade ein paar Experimente in einem Projekt gemacht, das CTI benutzt. Ich sehe keinen Grund, dass die gleiche Strategie nicht mit STI funktionieren würde.
Grundsätzlich habe ich etwas wie:
%Vor% Und es scheint genau zu funktionieren wie erwartet. Ich kann eine OrderNote erhalten, und die $order
-Eigenschaft enthält eine Unterklasse von Order.
Gibt es Einschränkungen bei der Verwendung von STI, die dies für Sie nicht möglich machen? Wenn ja, würde ich vorschlagen, zu CTI zu wechseln. Aber ich kann mir nicht vorstellen, warum das bei STI nicht funktionieren würde.
Wenn die kontaktierbare Entität abstrakt sein soll (@MappedSuperclass), müssen Sie die von Doctrine 2.2 + bereitgestellte ResolveTargetEntityListener
verwenden.
Es ermöglicht Ihnen im Grunde, eine Beziehung zu definieren, indem Sie eine Schnittstelle anstelle einer konkreten Entität angeben. (Vielleicht möchten Sie mehrere Schnittstellen definieren / erben, wenn Sie von mehreren "Kontaktpersonen" sprechen). Zum Beispiel können Sie dann die Schnittstelle in Ihrer abstrakten Klasse oder konkreten Klasse implementieren. Schließlich müssen Sie die konkrete Klasse (Entität) der entsprechenden Schnittstelle innerhalb der Datei config.yml definieren / zuordnen.
Ein Beispiel finden Sie in den Symfony-Dokumenten: Ссылка