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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top