Mehrere Unterscheidungsniveaus während Doctrine2 mit
-
30-09-2019 - |
Frage
Ich verwende Doctrine2 mein Modell zu verwalten unten. Es ist ein abstraktes Konzept Content
mit einem Composite-Muster in Gallery
, auch ein abstraktes Konzept Media
aus dem Video
und Image
inherits
war meine Wahl Diskriminatoren zu Content
und Media
Tabellen, um zwischen Gallery
, Video
und Image
zu unterscheiden hinzuzufügen. Content
Anwendungen JOIN inheritance
und Media
verwendet SINGLE_TABLE inheritance
.
Wie ich doctrine orm:schema-tool:create --dump-sql
ausführen, werden Media
Tabellenspalte aus der Content
einem duplizieren. Das ist die Ausgabe des Befehls:
CREATE TABLE Content (id INT AUTO_INCREMENT NOT NULL, container_id INT DEFAULT NULL, creationDate DATETIME NOT NULL, publicationDate DATETIME DEFAULT NULL, isGallery TINYINT(1) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE Media (id INT AUTO_INCREMENT NOT NULL, creationDate DATETIME NOT NULL, publicationDate DATETIME DEFAULT NULL, width INT NOT NULL, height INT NOT NULL, isImage TINYINT(1) NOT NULL, bitrate INT NOT NULL, duration INT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
CREATE TABLE Gallery (id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB;
ALTER TABLE Content ADD FOREIGN KEY (container_id) REFERENCES Gallery(id);
ALTER TABLE Gallery ADD FOREIGN KEY (id) REFERENCES Content(id) ON DELETE CASCADE
Hier sind meine Klassen und Anmerkungen:
content.php
/** @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="isGallery", type="boolean")
* @DiscriminatorMap({
* 0 = "Media",
* 1 = "Gallery"
* })
*/
abstract class Content
{
/** @Id @GeneratedValue @Column(type="integer") */
private $id;
/** @Column(type="datetime") */
private $creationDate;
/** @Column(type="datetime", nullable="true") */
private $publicationDate;
/** @ManyToOne(targetEntity="Gallery", inversedBy="contents") */
private $container;
}
media.php
/** @Entity
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="isImage", type="boolean")
* @DiscriminatorMap({
* 0 = "Video",
* 1 = "Image"
* })
*/
abstract class Media extends Content
{
/** @Column(type="integer") */
private $width;
/** @Column(type="integer") */
private $height;
}
gallery.php
/** @Entity */
class Gallery extends Content
{
/** @OneToMany(targetEntity="Content", mappedBy="container") */
private $contents;
}
video.php
/** @Entity */
class Video extends Media
{
/** @Column(type="integer") */
private $bitrate;
/** @Column(type="integer") */
private $duration;
}
image.php
/** @Entity */
class Image extends Media
{
}
Ich frage: Das ist das richtige Verhalten? Sollte Media
nicht nur die Felder id
, width
und height
, plus bitrate
und duration
von Video
?
Außerdem gibt es eine Möglichkeit der unnötigen Gallery
Tabelle loswerden?
Ich hoffe, ich habe es klar genug, aber zu fragen, fühlen Sie sich frei. Vielen Dank im Voraus.
UPDATE: No way. Ich habe versucht, ein noch einfacheres Beispiel nicht zeigen dieses Verhalten zu finden, aber ich fand keine.
Irgendwelche Vorschläge? Könnte dies einen Fehler in Lehre 2 sein oder ich eine einfachere Lösung fehlt?
Lösung
ich meine Frage beantworten ich gehofft, dass es jemand einen Tag helfen.
öffnete ich einen Fehlerbericht in GitHub für Doctrine2 mit dieser Frage und der Antwort ist ziemlich klar. Dies wird nicht unterstützt
AKTUALISIERT 2013.07.27
Ich habe gerade versucht dies mit Lehre 2.3.4 und es funktioniert wie erwartet. : D
Andere Tipps
Wenn sie alle abstrakten ich sind finde es mehr Sinn macht, nur zu setzen DiscriminatorMap
in der obersten Ebene Einheit.