Я использую Doctrine2 для управления моей моделью ниже: есть абстрактное понятие Content
с составным шаблоном в Gallery
, также абстрактное понятие Media
, от которого наследуются Video
и 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 или мне не хватает более простого решения?