xPh*_*eRe 5 php design-patterns doctrine-orm
我使用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
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
,加号bitrate
和duration
来自Video
?
此外,有没有办法摆脱不必要的Gallery
表?
我希望我说得够清楚,但是,请随意问.先感谢您.
更新:没办法.我试图找到一个更简单的例子没有显示这种行为,但我没有找到.
有什么建议?这可能是Doctrine 2中的错误还是我错过了一个更简单的解决方案?
我自己回答我的问题,希望有一天能帮助别人.
我在github上为doctrine2打开了一个关于doctrine2的错误报告,答案非常清楚:这是不受支持的.
更新2013/07/27
我刚用Doctrine 2.3.4尝试了这个,它按预期工作.:d