Anzeigen einer Diskriminator-Spalte, um ein Feld mit Doctrine 2
In meinem Projekt habe ich mehrere Klasse Tabelle Erbschaften wie diese:
namespace MyProject\Model;
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
*/
class Person
{
//...
}
/** @Entity */
class Employee extends Person
{
//...
}
Habe ich eine Methode, die konvertiert Entitäten, die auf arrays basiert auf den Feldern, die öffentlichen Getter. Das problem hier ist, dass ich verlieren die erbschaft-Informationen in mein-array, da die Diskriminator-Wert ist nicht gespeichert in einem Feld.
Also, was ich versucht habe, war die folgende, in der Hoffnung Lehre würde automatisch eingestellt $disc
:
class Person
{
//can I automatically populate this field with 'person' or 'employee'?
protected $discr;
public function getDiscr() { return $this->discr; }
public function setDiscr($disc) { $this->discr; }
//...
}
Gibt es eine Möglichkeit, diese Arbeit in der Lehre? Oder brauche ich zum Lesen der Klasse Metadaten, die in meiner Person-zu-array-Methode?
- Möglich, Duplikat der Kann ich auf Diskriminator-Bereich von php in doctrine2?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider, es gibt keinen dokumentierten Weg, um die Karte discr Spalte einer Einheit. Das ist, weil die discr Spalte wirklich die Datenbank und nicht die Person.
Jedoch, es ist durchaus üblich, nur der discr Wert direkt in der Klassendefinition. Es ist nicht zu ändern, und Sie werden immer dieselbe Klasse für den gleichen Wert sowieso.
Hier ist ein kleines Beispiel dessen, was ich in einem meiner ZF2-Projekten (mit Doctrine MongoDB ODM):
Was ich getan habe ist, ich habe implementiert eine benutzerdefinierte Schnittstelle
DiscriminatorAwareInterface
und ich nur die Prüfungen für die Klassen, die es implementieren (in deinem Fall wäre es die Klasse, dass alle "diskriminierten" - Klassen erweitern.Als ein Ergebnis ich am Ende mit code, der wie folgt aussieht:
Ich bin mir ziemlich sicher, dass es das gleiche sein wird, wenn Sie die standard-ORM, nur dass statt des Dokument-manager haben Sie entity-manager.
Habe dieses problem und löste es ohne Definition der Diskriminator als ein echtes Mitglied:
getMyDiscriminator()
?Können Sie die folgende Lösung: