2012-12-12 45 views
7

से एक और प्रश्न। मेरे पास एक सार बेसलॉग इकाई है जो मेरे उपयोगकर्ता को एसोसिएशन रखती है। इसके अतिरिक्त मेरे पास 2 इकाइयां हैं (FooLog & बारलॉग) जो बेसलॉग का विस्तार करती है। इसके अतिरिक्त मेरे पास मेरी उपयोगकर्ता इकाई है जो कि दो संगठनों को लॉग में रखने का अनुमान है। फूलॉग के लिए एक और बारलॉग के लिए एक। यहाँ मेरा मुद्दा है। मुझे त्रुटि संदेश मिलते हैं क्योंकि मुझे नहीं पता कि बेसलॉग की उलटाई कैसे इकाई को विस्तारित करने में फ़ील्ड को ओवरराइट करें। कृपया आप मेरी मदद कर सकते हैं।डॉक्ट्राइन 2 मैपिंग विरासत में उल्लिखित ओवरराइट मैप्डसुपरक्लास

क्योंकि मुझे लगता है कि मेरी व्याख्या वास्तव में अच्छी नहीं है, यहां मेरी संस्थाओं की स्थापना है।

BaseLog

/** @ORM\MappedSuperclass */ 
abstract class BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="logs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

FooLog

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    // Some additional fields 
} 

BarLog

/** @ORM\Entity */ 
class BarLog extends BaseLog { 
    // Some additional fields 
} 

उपयोगकर्ता

/** @ORM\Entity */ 
class User { 
    /** 
    * @ORM\OneToMany(targetEntity="FooLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $fooLogs; 

    /** 
    * @ORM\OneToMany(targetEntity="BarLog", mappedBy="user", cascade={"persist"}) 
    */ 
    private $barLogs; 
} 

मैं कैसे FooLog & BarLog में BaseLog के inversedBy ओवरराइट करना है। BaseLog

  • BaseLog:

    मैं इस पर कई मैपिंग त्रुटि को सेट करने में संघ BaseLog # उपयोगकर्ता उलटा पक्ष क्षेत्र उपयोगकर्ता # लॉग जो मौजूद नहीं है को दर्शाता है।

  • FooLog: एसोसिएशन FooLog # उपयोगकर्ता उलटा साइड फ़ील्ड उपयोगकर्ता # लॉग का संदर्भ देता है जो मौजूद नहीं है।
  • बारलॉग: एसोसिएशन बारलॉग # उपयोगकर्ता उलटा साइड फ़ील्ड उपयोगकर्ता # लॉग का संदर्भ देता है जो मौजूद नहीं है।
  • उपयोगकर्ता: मैपिंग उपयोगकर्ता # fooLogs और FooLog # उपयोगकर्ता एक-दूसरे के साथ असंगत हैं।
  • उपयोगकर्ता: मैपिंग उपयोगकर्ता # बारलॉग और बारलॉग # उपयोगकर्ता एक-दूसरे के साथ असंगत हैं।

कृपया मेरी मैपिंग सॉर्ट करने में मेरी सहायता करें।

+0

क्या आपने कभी इसे हल किया है? मुझे एक समान स्थिति का सामना करना पड़ रहा है। – hafichuk

+0

संभावित डुप्लिकेट [ओवरराइडिंग ओवरवर्डिंग मैक्प्रिन 2 विरासत में मैपिंग] (http://stackoverflow.com/questions/22745653/overriding-inversedby-mapping-in-doctrine-2-heheritance) – PowerKiKi

+0

@ हाफिचुक, एक डुप्लिकेट प्रश्न है वहां एक उत्कृष्ट उत्तर: http://stackoverflow.com/a/22820964/37706 – PowerKiKi

उत्तर

4

मुझे एकल विरासत के साथ समान समस्या थी। मैंने दोनों इकाई वर्गों (अभिभावक और विरासत में) में एक ही संगठन को परिभाषित करके हल किया लेकिन विभिन्न नामों के साथ। आपके मामले में आप यह कोशिश कर सकते हैं:

/** @ORM\Entity */ 
class FooLog extends BaseLog { 
    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="foologs") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
    * }) 
    */ 
    private $user; 
} 

और वर्ग BarLog में:

/** @ORM\Entity */ 
    class BarLog extends BaseLog { 
     /** 
     * @ORM\ManyToOne(targetEntity="User", inversedBy="barlogs") 
     * @ORM\JoinColumns({ 
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=true, onDelete="SET NULL") 
     * }) 
     */ 
     private $bar_user; 
    } 

सूचना अलग नाम ($ bar_user)। आपको उपयोगकर्ता इकाई में मूर्खों और बैकलॉग गुणों को भी परिभाषित करना होगा। यह सिद्धांत सत्यापन त्रुटियों को हटा देता है।

1

आईआईआरसी सिद्धांत के पुराने संस्करणों में मैपिंग को ओवरराइड करने का कोई अच्छा तरीका नहीं था। सिद्धांत में> = 2.2 association override नामक कुछ है तो शायद आप इसका उपयोग कर सकते हैं।

बीटीडब्ल्यू आप एसोसिएशन को आधार से कंक्रीट कक्षाओं में क्यों नहीं ले जाना चाहते हैं और वैध उलटा परिभाषित करते हैं?

+0

मैं एसोसिएशन को बेसलॉग में रखना चाहता हूं क्योंकि उपयोगकर्ता इकाई के लिए var नाम को छोड़कर यह हर बार समान होता है। –

+0

मुझे प्रलेखन में एक नज़र डाली गई थी लेकिन मुझे नहीं पता कि कैसे ओवरराइड किया गया है। कोई अन्य सुझाव? –

3

मैंने Single Table Inheritance का उपयोग कर एक ही समस्या के साथ संघर्ष किया है। जहां तक ​​मैं कह सकता हूं कि इसका कोई समाधान नहीं है।भले ही inversedBy अनिवार्य माना जाता है, ऐसा लगता है कि आप इसे अनदेखा कर सकते हैं। हालांकि, जैसा कि डॉक्टर डॉक्स का सुझाव है कि प्रदर्शन तेजी से खराब हो जाता है।

@AssociationOverride मदद नहीं करता है, क्योंकि आप एसोसिएशन परिभाषाओं को संशोधित नहीं कर सकते हैं, केवल डेटाबेस कॉलम गुण।

मैंने कई विकल्पों की कोशिश की है, जिनमें से कोई भी संतोषजनक नहीं है।

अद्यतन:app/console doctrine:schema:validate चलाते समय भी मुझे त्रुटियों के इस तरह के समाधान का कोई समाधान नहीं मिला है।

[Mapping] FAIL - The entity-class 'Acme\AcmeBundle\Entity\CourseLocation' mapping is invalid: 
* The field Acme\AcmeBundle\Entity\CourseLocation#facilitators is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Acme\AcmeBundle\Entity\CourseFacilitatorResponsibility#courseLocation does not contain the required 'inversedBy' attribute. 

इस उदाहरण CourseFacilitatorResponsibility में एक उप-वर्ग (एकल तालिका विरासत के साथ) CourseResponsibility की है। CourseLocation कई CourseResponsibility इकाइयों को संदर्भित करता है। मुझे लगता है कि यूनी-दिशात्मक संघ इसके आसपास एकमात्र रास्ता है।

+0

मैं भी इस समस्या में भागता हूं। क्या अब तक कोई समाधान है? – edditor