Ich experimentiere mit der Lehre ORM (v1.2) für PHP. Ich habe eine Klasse "Schnaps" definiert, mit zwei Kinderklassen "Gin" und "Whiskey". Ich verwende die konkrete Vererbung (Klassentischvererbung in der meisten Literatur), um die Klassen drei separaten Datenbanktabellen zuzuordnen.PHP Doktrin 1.2 ORM - polymorphe Abfragen mit Klassentabelle Vererbung
Ich versuche, die folgende auszuführen:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
Anfangs erwartete ich $ Likören ein Doctrine_Collection alle Flotten sein, das, ob sie Whisky oder Gin sein. Aber wenn ich den Code ausführe, bekomme ich eine leere Sammlung, obwohl ich mehrere Reihen in den Whiskey- und Gin-Datenbanktabellen habe. Auf der Grundlage des generierten SQL verstehe ich, warum: Das ORM fragt die "Likör" -Tabelle ab und nicht die Whiskey/Gin-Tabellen, in denen die tatsächlichen Daten gespeichert sind.
Beachten Sie, dass der Code einwandfrei funktioniert, wenn ich den Vererbungstyp auf Spaltenaggregation (einfache Tabellenvererbung) umschalte.
Was ist der beste Weg, um eine Doctrine_Collection zu erhalten, die alle Liköre enthält?
aktualisiert
Nach einiger mehr Forschung, sieht es aus wie ich Lehre mich erwarte einen SQL UNION
Betrieb hinter den Kulissen werden die Durchführung der Ergebnissätze aus dem „Whisky“ und „Gin“ Tabellen zu kombinieren.
Dies ist bekannt als polymorphe Abfrage.
Gemäß this ticket ist diese Funktion in Doctrine 1.x nicht verfügbar. Es ist für die Version 2.0 bestimmt. (Siehe Doktrin 2.0 Docs für CTI).
Angesichts dieser Informationen, was wäre der sauberste und effizienteste Weg, um diesen Mangel zu umgehen? Zur Single-Table-Vererbung wechseln? Führen Sie zwei DQL-Abfragen aus und führen Sie die resultierenden Doctrine_Collections manuell zusammen?