使用Doctrine2时存在多种歧视级别

xPh*_*eRe 5 php design-patterns doctrine-orm

我使用Doctrine2以下管理我的模型:有一个抽象的概念Content,在一个复合模式Gallery,也是一个抽象的概念,MediaVideoImage继承.

我的选择是添加鉴别器ContentMedia表格以区分Gallery,VideoImage.Content用途JOIN inheritanceMedia用途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
Run Code Online (Sandbox Code Playgroud)

这是我的课程和注释:

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;
}
Run Code Online (Sandbox Code Playgroud)

忽略原始

/** @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;
}
Run Code Online (Sandbox Code Playgroud)

Gallery.php

/** @Entity */
class Gallery extends Content
{
    /** @OneToMany(targetEntity="Content", mappedBy="container") */
    private $contents;
}
Run Code Online (Sandbox Code Playgroud)

Video.php

/** @Entity */
class Video extends Media
{
    /** @Column(type="integer") */
    private $bitrate;
    /** @Column(type="integer") */
    private $duration;
}
Run Code Online (Sandbox Code Playgroud)

Image.php

/** @Entity */
class Image extends Media
{
}
Run Code Online (Sandbox Code Playgroud)

我问:那是正确的行为吗?不Media应该只有字段id,width而且height,加号bitrateduration来自Video

此外,有没有办法摆脱不必要的Gallery表?

我希望我说得够清楚,但是,请随意问.先感谢您.

更新:没办法.我试图找到一个更简单的例子没有显示这种行为,但我没有找到.

有什么建议?这可能是Doctrine 2中的错误还是我错过了一个更简单的解决方案?

xPh*_*eRe 6

我自己回答我的问题,希望有一天能帮助别人.

在github上为doctrine2打开了一个关于doctrine2错误报告,答案非常清楚:这是不受支持的.

更新2013/07/27

我刚用Doctrine 2.3.4尝试了这个,它按预期工作.:d