Ich hatte geplant, meine Anwendung zu erstellen und ein ORM für die Modelle zu verwenden, aber die Sache ist, dass es einen Teil der Datenbank gibt, der Entity-Attribute-Value-Tabellen verwendet.
Ich mochte Doctrine ORM sehr, aber ich weiß nicht, ob es möglich ist, vielleicht Klassen zu erstellen, die wie jede gewöhnliche Doktrin-Entität aussehen würden, wenn die tatsächlich verknüpfte Tabelle vom EAV-Stil ist.
Wäre es möglich, Doctrine dafür zu verwenden, und wenn ja, wie?
Im Hinblick auf EAV es Es scheint offensichtlich zu sein, wie man eine Beziehung zwischen entity
und attribute
mit Hilfe der Doktrin aufbauen kann. Im kompliziertesten Fall handelt es sich um ein Viele zu viele Beziehung.
Nehmen wir an, wir möchten ein Attribut Name
einer Entität User
zuordnen. Unter der Annahme, dass ein Benutzer genau einen Namen hat und jeder Name genau einem Benutzer gehört, kann dieser Link mit Eins zu eins Beziehung
Aber wie modelliere ich die Beziehung zwischen attribute
und value
? Das Problem ist, dass Werte unterschiedliche Typen sein können oder sogar eine unterschiedliche Anzahl von Feldern benötigen, um ihre Informationen zu speichern.
Betrachten Sie die Attribute name
und phone_number
. Während ein Name möglicherweise durch eine Zeichenfolge dargestellt wird, könnte für die Telefonnummer eine Ganzzahl erforderlich sein. Oder es ist sogar notwendig, nicht nur die Nummer, sondern auch die Vorwahl in einem separaten Feld zu hinterlegen.
Da EAV eine sehr flexible Wertdarstellung erfordert, ist es nicht möglich, alle von ihnen innerhalb desselben Feldes in einer Datenbanktabelle zu speichern (Blobs, Datenserialisierung und dergleichen ignorieren). Daher verwenden die meisten EAV-Implementierungen verschiedene Tabellen, die verschiedene Werttypen repräsentieren.
Um eine solche Flexibilität zu erreichen, bietet die Doktrin Vererbung Mapping Es erlaubt Ihnen im Grunde, Doktrinsentitäten zu erweitern. Sie geben dabei discriminator
für jeden Untertyp Ihrer Entität an:
Die Klasse Value
bietet eine gemeinsame Implementierung für alle Werte, d. h. eine ID. Jede Unterklasse (d. H.% Co_de% und Name
) erweitert diese gemeinsamen Werte um ihre spezifischen, z. B. zusätzliche Felder.
PhoneNumber
definiert eine Spalte in der Elternrelation, die den Typ des Wertes speichert. @DiscriminatorColumn
wird von der Doktrin verwendet, um den Typ von @DiscriminatorMap
einer dieser Klassen zuzuordnen. Die Beziehung zwischen @DiscriminatorColumn
und attribute
kann für die Elternklasse angegeben werden. Das Aufrufen von Werten aus dem Attribut ruft dann alle Arten von Werten ab, die während der Laufzeit gefiltert und behandelt werden können, beispielsweise unter Verwendung von instanceof .
Tags und Links php orm doctrine entity-attribute-value