2010-10-14 6 views
5

का उपयोग करते समय मैं नीचे अपने मॉडल का प्रबंधन करने के Doctrine2 उपयोग कर रहा हूँ: वहाँ Gallery में एक समग्र पैटर्न, भी एक अमूर्त अवधारणा Media साथ एक अमूर्त अवधारणा Content है जो Video और Image inherits से।एकाधिक भेदभाव का स्तर Doctrine2

मेरे चुनाव क्रम Gallery, Video और Image के बीच अंतर करने में Content और Media तालिकाओं के लिए discriminators जोड़ने के लिए किया गया था। ContentJOIN 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 और durationVideo से है?

इसके अलावा, क्या अनावश्यक Gallery तालिका से छुटकारा पाने का कोई तरीका है?

मुझे उम्मीद है कि मैंने इसे स्पष्ट कर दिया है, हालांकि, पूछने के लिए स्वतंत्र महसूस करें। पहले ही, आपका बहुत धन्यवाद।

अद्यतन: कोई रास्ता नहीं। मैंने इस व्यवहार को न दिखाते हुए एक आसान उदाहरण खोजने की कोशिश की, लेकिन मुझे कोई नहीं मिला।

कोई सुझाव? क्या यह सिद्धांत 2 में एक बग हो सकता है या मुझे एक आसान समाधान याद आ रहा है?

उत्तर

5

मैं अपने प्रश्न का उत्तर देता हूं कि उम्मीद है कि यह किसी दिन किसी की मदद करेगा।

मैंने इस प्रश्न के साथ bug report in github for doctrine2 खोला और उत्तर स्पष्ट है: यह समर्थित नहीं है।

अपडेट 2013/07/27

मैं सिर्फ सिद्धांत 2.3.4 के साथ इस की कोशिश की और यह उम्मीद के रूप में काम करता है।: डी

+0

मैं सिद्धांत 2.3.4 भी साथ हूँ, लेकिन व्यवहार नहीं करता है काम करता है। तालिका मीडिया नहीं बनाई गई है, तो आप कुछ प्रतिक्रिया है? https://github.com/paulandrieux/MultipleInheritanceSandbox: –

+0

आप अपने परीक्षण यहाँ देख सकते हैं –

0

अगर वे सब सार मुझे लगता है कि यह केवल शीर्ष स्तर इकाई में DiscriminatorMap डाल करने के लिए और अधिक समझ में आता है कर रहे हैं।