Zum Inhalt springen

Objekte und abgeleitete Objekte als Aggregate in der gleichen Collection

Erstellt am 11. Juli 2014 · 1 Antwort · letzte Antwort am 14. Juli 2014

Tags: Frage

morlock ·

Hallo zusammen!

Ich habe heute folgendes Problem: Ich wollte in einem Objekt aggregierte Objekte unterschiedlichen Typs zur Verfügung haben. Es existiert ein Basis-Model und ein davon abgeleitetes Model. Objekte beider Typen sollen im Elternobjekt zur Verfügung stehen. Ich habe mir Testdaten in einer DB gebaut und musste jetzt feststellen, dass alle Objekte den "Basistyp" haben.

Zum besseren Verständnis:
- ich habe ein Objekt "Garage", das beliebig viele Objekte vom Typ "Fahrzeug" enthalten kann (die Städtplaner Deutschlands werden jetzt bestimmt hellhörig ;-) )
- "Fahrzeug" ist das Basisobjekt, das alle elementaren Felder enthält
- "PKW" ist ein abgeleitetes Objekt mit zusätzlichen Eigenschaften

Lade ich jetzt meine handgeklöppelte Garage aus der Datenbank, haben alle Objekte den Typ "Fahrzeug", obwohl auch "PKW"s dabei sind.

Bin ich da in eine Sackgasse gelaufen oder ist das doch irgendwie möglich?

Viele Grüße,
Christian

morlock · · Beste Antwort

Hallo nochmal!

Ich habe die Lösung selbst gefunden und wollte Sie hier eben mitteilen, weil sie - neben dem, was in der Dokumentation steht - noch eine Erkenntnis gebracht hat.

1. Des Rätsels Lösung:
Es ist ja erforderlich eine DiscriminatorMap zu haben. Diese wird zwar laut Dokumentation (zumindest bei Class Table Inheritance) automatisch generiert - das scheint aber in Flow nicht zu funktionieren - zumindest tat es das bei mir nicht. Nachdem ich die DiscriminatorMap (sowie die DiscriminatorColumn) hinzugefügt hatte, hat es funktioniert.

2. Die weitere Erkenntnis:
Ich hatte die DiscriminatorMap und -Column zunächst nur bei der Basis-Klasse ("Fahrzeug") eingefügt. Das hatte zur Folge, dass beim Laden des Root-Objekts der Fehler auftrat, dass die Spalte "dtype" nicht definiert sei. Nachdem ich herausgefunden hatte, dass das der Standardname für die DiscriminatorColumn in Doctrine ist, war die Lösung einfach, DiscriminatorMap und -Column auch in der abgeleiteten Klasse in die Annotations aufzunehmen. Dann hat's funktioniert.

Das Problem ist also gelöst - wenn jemand klären kann, warum der Automatismus in Flow nicht zu funktionieren scheint oder warum ich (entgegen dem Beispiel in den Doctrine-Docs) die DiscriminatorMap und -Column auch in der abgeleiteten Klasse aufführen muss, wäre ich trotzdem dankbar.

Viele Grüße,
Christian