Несколько уровней дискриминации при использовании Doctrine2

Я использую Doctrine2 для управления своей моделью ниже: В галерее есть абстрактная концепция Контент с шаблоном Composite, также абстрактная концепция Медиа , от которой наследуются Видео и Изображение .

Я решил добавить дискриминаторы в Контент и ] Медиа , чтобы различать Галерея , Видео и Изображение . Контент использует наследование JOIN и Медиа использует наследование SINGLE_TABLE .

Когда я запускал 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 , плюс битрейт и длительность из Видео ?

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

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

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

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

5
задан Community 8 February 2017 в 14:30
поделиться