Question

J'utilise Doctrine2 pour gérer mon modèle ci-dessous. Il y a un concept abstrait Content avec un motif composite Gallery, également un concept abstrait Media dont hérite Video et Image

Mon choix était d'ajouter discriminateurs aux tables de Content et Media afin de faire la différence entre Gallery, Video et Image. utilisations Content JOIN inheritance et Media utilise SINGLE_TABLE inheritance.

Comme je lance doctrine orm:schema-tool:create --dump-sql, table Media dédouble colonnes du Content un. C'est la sortie de la commande:

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

Voici mes classes et annotations:

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
{
}

Je demande: C'est le comportement correct? Ne devrait pas avoir Media uniquement les champs id, width et height, plus bitrate et duration de Video?

D'ailleurs, est-il un moyen de se débarrasser de la table unnecesary de Gallery?

J'espère que je l'ai fait assez clair, cependant, ne hésitez pas à demander. Nous vous remercions à l'avance.

Mise à jour: No way. J'ai essayé de trouver un exemple encore plus simple ne montrant pas ce comportement, mais je trouve pas.

Toutes les suggestions? Serait-ce un bogue dans Doctrine 2 ou je manque une solution plus simple?

Était-ce utile?

La solution

Je réponds à ma question moi-même en espérant qu'il va aider quelqu'un un jour.

J'ai ouvert un rapport de bogue dans github pour Doctrine2 cette question et la réponse est assez claire:. non pris en charge

MISE À JOUR 27/07/2013

Je viens d'essayer cela avec la doctrine et 2.3.4 fonctionne comme prévu. : D

Autres conseils

Si elles sont toutes abstraites je trouve qu'il est plus logique de mettre DiscriminatorMap que dans l'entité de niveau supérieur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top