2016-12-20 11 views
10

से माता-पिता के बजाय बाल प्रकार का ऑब्जेक्ट प्राप्त करें, मैं मोंगोडीबी से ऑब्जेक्ट पुनर्प्राप्त करने का प्रयास कर रहा हूं लेकिन मुझे एक समस्या का सामना करना पड़ रहा है कि यह बच्चे के बजाय आधार प्रकार के तत्व को वापस कर रहा है और यह परेशानी पैदा कर रहा है, मुझे पता चला कि यह किसी संपत्ति के मूल्य पर निर्भर है।मोंगोडीबी

/** 
* @MongoDB\Document(
*  collection="zoo", 
*  repositoryClass="ZooRepository", 
*) 
*/ 
class Zoo 
{ 
    /** 
    * @MongoDB\ReferenceMany(targetDocument="Animal", inversedBy="zoo", strategy="addToSet") 
    * @var \Doctrine\Common\Collections\ArrayCollection 
    */ 
    protected $animals; 


    /** 
    * @return mixed 
    */ 
    public function getAnimals() 
    { 
     return $this->animals->toArray(); 
    } 

    //Some more code 

} 


/** 
* @MongoDB\Document(
*  repositoryClass="AnimalRepository", 
*  collection="animals" 
*) 
* @MongoDB\InheritanceType("SINGLE_COLLECTION") 
* @MongoDB\DiscriminatorField("discriminator") 
* @MongoDB\DiscriminatorMap({ 
*  "animal"="Animal", 
*  "birds"="Bird", 
*  "mamals"="Mamals"}) 
*/ 
class Animal 
{ 
    /** 
    * @MongoDB\ReferenceMany(targetDocument="Location", mappedBy="animals", simple=true, cascade={"persist"}) 
    * 
    * @Assert\Count(min="0", max="1") 
    */ 
    protected $locations; 
} 


/** 
* @MongoDB\Document(repositoryClass="AnimalRepository") 
*/ 
class Bird extends Animal 
{ 

} 

/** 
* @MongoDB\Document(repositoryClass="AnimalRepository") 
*/ 
class Mamals extends Animal 
{ 

} 

समस्या यह है: जब मैं ZooHandler से getAnimals() को कॉल करता हूं तो यह पशु प्रकार का ऑब्जेक्ट देता है। मैं चाहता हूं कि मामाल्स या बर्ड का प्रकार क्या है। अजीब बात यह है कि, अगर मेरे पास पशु-> स्थान में कोई तत्व है तो मुझे यह सही मिला (मामल/बर्ड) और यदि उसके पास तत्व नहीं है तो मुझे आधार प्रकार मिला।

यदि मुझे AnimalHandler में AnimalRepository से सीधे सभी जानवरों की सूची मिलती है, तो मुझे तदनुसार मामल/पक्षी की वस्तुएं मिल रही हैं।

संपादित: चिड़ियाघर वस्तु

> db.zoo.findOne() 
{ 
    "_id" : ObjectId("5822bd23085f753b5a5a2408"), 
    "name" : "Zoo 2", 
    "active" : true, 
    "archived" : false, 
    "animals" : [ 
     DBRef("animals", ObjectId("556cc7adec045b1a0c8b4567"),{ "$db": "tester", "discriminator": "Test\\Bundle\\Core\\Document\\Animal" }), 
     DBRef("animals", ObjectId("556cb3b0ec045bbf068b4582"),{ "$db": "tester", "discriminator": "Test\\Bundle\\Core\\Document\\Animal" }) 
    ] 
} 

यकीन के लिए वहाँ कुछ और गुण है कि नहीं दिखाए जाते हैं, के रूप में वे अप्रासंगिक हो रहे हैं।

+0

समस्या अजीब लगती है, क्या आप एक चिड़ियाघर ऑब्जेक्ट के लिए डेटाबेस में संग्रहीत पोस्ट कर सकते हैं? कृपया ध्यान दें कि डेटाबेस में उपयोग किया जाने वाला डीबीआरआईफ़ डिफ़ॉल्ट रूप से कोई अतिरिक्त फ़ील्ड नहीं दिखाएगा ओडीएम को जोड़ा जाना चाहिए (जैसे भेदभावकर्ता) और इनमें से हम सबसे अधिक दिलचस्पी रखते हैं – malarzm

+0

@malarzm कृपया मेरा संपादन देखें। – Tester

+0

हम रुचि रखते हैं कि डीबीआरआईएफ क्या छुपा रहे हैं जैसा कि मैंने पिछली टिप्पणी में बताया था, आप https://github.com/TylerBrock/mongo-hacker का उपयोग कर सकते हैं जो प्रिंट किए गए तरीके को बदलता है या http://stackoverflow.com/ ए/14633601/5982920 उन्हें प्रिंट करने के लिए कैसे – malarzm

उत्तर

0

मुझे पता चला कि अगर मैं एक बेस क्लास ऑब्जेक्ट के रूप में एक इकाई को सहेजता हूं तो यह बेस क्लास की ऑब्जेक्ट लौटाएगा और इसलिए उपर्युक्त उदाहरण में यदि मुझे वांछित परिणाम प्राप्त करने की आवश्यकता है, तो मुझे इसे उचित रूप से सहेजना होगा।

0

यदि मैं आपकी समस्या को सही ढंग से समझता हूं, तो आपको PHP के अंतर्निहित get_class() या get_called_class() फ़ंक्शंस की आवश्यकता है।

नोट: ऑब्जेक्ट्स खुद को नहीं भूल जाना चाहिए कि किस वर्ग वे संबंध रखते हैं, वे एक समारोह/विधि है कि केवल "जानता" वे सुपर क्लास के कुछ उदाहरण या उसके उपवर्गों में से एक लौट रहे हैं द्वारा दिया जा रहा है, भले ही। इसलिए आपको get_class($instance) फ़ंक्शन के माध्यम से हमेशा यह पूछने में सक्षम होना चाहिए कि एक वर्ग किस उदाहरण से संबंधित है।

+0

नहीं, यह अप्रासंगिक है। – Tester