Несколько уровней дискриминации при использовании Doctrine2 - PullRequest
5 голосов
/ 14 октября 2010

Я использую Doctrine2 для управления моей моделью ниже: есть абстрактное понятие Content с составным шаблоном в Gallery, также абстрактное понятие Media, от которого наследуются Video и Image.

image

Мой выбор состоял в том, чтобы добавить дискриминаторы в таблицы Content и Media, чтобы различать Gallery, Video и Image.Content использует JOIN inheritance, а Media использует SINGLE_TABLE inheritance.

Когда я запускаю doctrine orm:schema-tool:create --dump-sql, Media таблица дублирует столбцы из Content.Это вывод команды:

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

Вот мои классы и аннотации:

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

Я спрашиваю: это правильное поведение?Не должно ли Media иметь только поля id, width и height, плюс bitrate и duration из Video?

Кроме того, есть ли способ избавиться отненужный Gallery стол?

Надеюсь, я достаточно ясно дал понять, но не стесняйтесь спрашивать.Заранее спасибо.

ОБНОВЛЕНИЕ: Ни за что.Я попытался найти еще более простой пример, не показывающий такого поведения, но я не нашел ни одного.

Есть предложения?Может ли это быть ошибкой в ​​Doctrine 2 или мне не хватает более простого решения?

Ответы [ 2 ]

6 голосов
/ 25 октября 2010

Я отвечаю на свой вопрос сам, надеясь, что он кому-нибудь когда-нибудь поможет.

Я открыл отчет об ошибке в github для doctrine2 с этим вопросом, и ответ довольно ясен: это не поддерживается.

ОБНОВЛЕНО 2013/07/27

Я только что попробовал это с Doctrine 2.3.4, и он работает, как и ожидалось.: D

0 голосов
/ 03 июня 2015

Если они все абстрактные, я считаю, что имеет смысл ставить DiscriminatorMap только в сущности верхнего уровня.

...