Çoklu ayrım seviyeleri Doctrine2 kullanırken

0 Cevap php

Ben aşağıda benim modeli yönetmek için Doctrine2 kullanıyorum: Gallery bir Kompozit desen, Media hangi {[da soyut bir kavram olan soyut bir kavram Content var (3)]} ve Image devralır.

Seçimim Video, Gallery ayırt etmek için Content ve Media tablolara Diskriminatörleri eklemek ve {[(4)] }. Content kullanım JOIN inheritance ve Media kullanım SINGLE_TABLE inheritance.

I-doctrine orm:schema-tool:create --dump-sql çalıştırmak üzere, Media tablo Content birinden sütun çoğaltma edilir. Bu komutun çıktısı bulunuyor:

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

İşte benim sınıfları ve açıklamaları şunlardır:

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
{
}

Ben soruyorum: Bu doğru bir davranış? Media sadece alanları id, width ve height artı bitrate ve {[(5 olması gerekmez )]} dan Video?

Ayrıca, unnecesary Gallery tablonun kurtulmak için bir yol var?

Ben yeterince açık olsa da, sormaya çekinmeyin yapılan umuyoruz. Şimdiden teşekkür ederim.

UPDATE: Olamaz. Ben daha basit bir örnek bu davranışı gösteren değil bulmaya çalıştım, ama hiçbiri bulundu.

Herhangi bir öneriniz? Bu Doktrini 2 bir hata olabilir ya ben basit bir çözüm kaçırıyorum?

0 Cevap