5

以下のモデルを管理するためにDoctrine2 を使用してContentいます。GalleryMediaVideoImage

私が選んだのは、 と を区別するために と の表に識別子を追加することContentでしMediaた。を使用して使用します。GalleryVideoImageContentJOIN inheritanceMediaSINGLE_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;
}

ギャラリー.php

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

ビデオ.php

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

Image.php

/** @Entity */
class Image extends Media
{
}

私は尋ねます:それは正しい振る舞いですか?Mediaフィールドidwidthand height、 plus bitratedurationfromだけではいけませんVideoか?

Galleryまた、不要なテーブルを削除する方法はありますか?

十分に理解できたと思いますが、お気軽にお尋ねください。前もって感謝します。

更新:まさか。この動作を示さないさらに単純な例を見つけようとしましたが、何も見つかりませんでした。

助言がありますか?これは Doctrine 2 のバグでしょうか、それとももっと簡単な解決策がありませんか?

4

2 に答える 2

6

いつか誰かに役立つことを願って、私は自分の質問に答えます。

この質問でdoctrine2のgithubでバグレポートを開きましたが、答えは非常に明確です:これはサポートされていません.

2013/07/27更新

Doctrine 2.3.4 でこれを試したところ、期待どおりに動作しました。:D

于 2010-10-25T17:36:03.227 に答える
0

DiscriminatorMapそれらがすべて抽象的である場合、トップレベルのエンティティのみに配置する方が理にかなっていると思います。

于 2015-06-02T22:47:31.563 に答える