2011-02-19 24 views
5

टाइप करके मेरे पास दो इकाइयां हैं - समाचार और पृष्ठ। परिभाषा इस तरह दिखता है:सिद्धांत 2 - कक्षा तालिका विरासत,

 
/** 
* Description of Page 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap({ 
* "news" = "News" , 
* "page" = "Page"}) 
* 
* @table(
* name="pages" 
*) 
*/ 
class Page extends BaseEntity {...} 
class News extends Page {...} 

मुझे पता है, केवल "समाचार" संस्थाओं का चयन करने के लिए कैसे - सरल SELECT ... FROM News n

लेकिन क्या कोई तरीका है कि केवल "पृष्ठ" इकाइयों का चयन कैसे करें, जो सीधे पृष्ठ वर्ग पर मैप किए जाते हैं? या क्या मुझे इसके लिए विस्तारित कुछ अतिरिक्त इकाई बनाना है?

+0

आप क्या करने की कोशिश कर रहे हैं? मुझे यकीन नहीं है कि आप क्लास टेबल विरासत का उचित तरीके से उपयोग करते हैं। –

+0

मेरे पास मूल इकाई पृष्ठ है, जिसमें शीर्षक, पाठ, लेखक इत्यादि जैसी संपत्तियां हैं। समाचार इसे सारांश, टिप्पणियां एसोसिएशन जैसे कुछ अतिरिक्त गुणों के साथ विस्तारित करता है ... संभवतः एकल तालिका विरासत का उपयोग करके ऐसा करना संभव होगा, लेकिन मैं करता हूं ऐसा नहीं लगता कि यह सही दृष्टिकोण है, क्योंकि परिणाम एक बड़ी मेज है। –

+0

क्या मुझे कुछ याद आया? ... आप केवल 'चयन * पृष्ठ से क्यों पूछ सकते हैं ...'? – Cobby

उत्तर

11

समाधान WHERE खंड में x INSTANCE OF Entity का उपयोग करना है।

class PageRepository extends EntityRepository 
{ 
    protected $_switchEntityNameSave = null; 

    /** 
    * @param type $fqcn 
    */ 
    protected function _swapEntityDiscriminator($fqcn = null){ 
    if(isset($fqcn)){ 
     $this->_switchEntityNameSave = $this->_entityName; 
     $this->_entityName = $fqcn; 
    } else { 
     $this->_entityName = $this->_switchEntityNameSave; 
     unset($this->_switchEntityNameSave); 
    } 
    } 

    // ... AND TO USE... 

    public function findSomeStuff() 
    { 
    $this->_swapEntityDiscriminator(News::getFqcn()); 
    // The query, the result in a variable, $q for example 
    $this->_swapEntityDiscriminator(); 
    return $q->getQuery(); 
    } 

} 

फिर, माता पिता classe में, मैं मनुष्य getFqcn() कार्य करें:

http://groups.google.com/group/doctrine-user/browse_thread/thread/b1dc52ed447204e2

0

समाधान, कि मैं का उपयोग करें कि मैं जड़ इकाई Repository वर्ग पर एक स्विचर बनाने इसलिए की तरह, है , जैसे:

abstract class BaseEntity { 
    /** 
    * Get fqcn 
    * 
    * Fully Qualified Class Name 
    * 
    * @return string 
    */ 
    public static function getFqcn() 
    { 
     return get_called_class(); 
    } 
    // ... 
} 

जो देर स्थिर बाध्यकारी सुविधा का उपयोग करते हैं और मुझे ठोस वस्तु पर पूर्ण श्रेणी का नाम देते हैं (या तो News या Page)।

मैं इसे तत्काल नहीं करना सुनिश्चित करने के लिए सार डालता हूं।

क्या मैं भी ठोस वर्ग, कुछ स्थिरांक में जोड़ें:

class News extends Page { 
    const HUMAN_READABLE = "News"; 
    const DISCRIMINATOR = "news"; // SAME as your @DiscriminatorMap() Annotation. 

} 

इस तरह, मेरी Repository मैं केवल प्रकारों में से एक पर विशेष ढूँढ़ने बना सकते हैं।

संबंधित मुद्दे