Plusieurs niveaux de discrimination tout en utilisant Doctrine2
-
30-09-2019 - |
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?
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.