2012-10-09 27 views
13

के साथ सिम्फनी 2 में विस्तारित इकाइयां मुझे डॉक्ट्रिन 2 का उपयोग ओआरएम के रूप में सिम्फनी 2 में बंडलों में एक इकाई को उचित रूप से विस्तारित करने का एक तरीका खोजने में परेशानी हो रही है।डॉक्ट्रिन 2

वर्तमान में तीन विधियां हैं जिन्हें मैंने Symfony2 में ओआरएम के रूप में Doctrine2 का उपयोग करके इकाइयों को विस्तारित करने के लिए पाया है। Mapped Superclass, Single Table Inheritance और Class Table Inheritance। मैं जो कुछ भी करना चाहता हूं उसके लिए इनमें से कोई भी काम नहीं है।

मेरे पास दो बंडल हैं: उपयोगकर्ता बंडल और ब्लॉगबंडल। मैं उन परियोजनाओं में UserBundle का उपयोग करने में सक्षम होना चाहता हूं जिनके पास BlogBundle नहीं है, लेकिन ब्लॉगबंडल हमेशा उन परियोजनाओं में उपयोग किया जाएगा जिनमें उपयोगकर्ता बंडल है। यह ठीक है अगर BlogBundle उपयोगकर्ता बंडल पर निर्भरता है, लेकिन दूसरी तरफ नहीं। वहाँ उपयोगकर्ता और ब्लॉग पोस्ट के बीच कई रिश्ते के लिए एक होने की जरूरत है: BlogBundle \ इकाई \ पोस्ट और UserBundle \ इकाई \ उपयोगकर्ता

रिश्ता:

मैं दो संस्थाओं की है। मैं कॉल कर सकते हैं UserBundle \ इकाई \: यह एक Author_ID संपत्ति (स्तंभ) BlogBundle \ इकाई \ पोस्ट वस्तु (टेबल) पर जो UserBundle \ इकाई \ User.id

समस्या को मैप किया है के माध्यम से हासिल की है उपयोगकर्ता इकाई सीधे ब्लॉगबंडल के भीतर से और एक यूनी-दिशात्मक मैपिंग का उपयोग करके मैं जो खोज रहा हूं उसे प्राप्त कर सकता हूं। यह मुझे किसी उपयोगकर्ता द्वारा उपयोगकर्ता ऑब्जेक्ट के भीतर से सभी पोस्ट तक पहुंचने की अनुमति नहीं देता है। मैं कस्टम क्वेरी के माध्यम से डेटा तक पहुंच सकता हूं लेकिन यह उपयोगकर्ता ऑब्जेक्ट के माध्यम से किसी उपयोगकर्ता द्वारा पोस्ट तक पहुंच के रूप में साफ नहीं है।

मैं जो करना चाहता हूं वह ब्लॉगबंडल के भीतर से उपयोगकर्ताबंडल \ Entity \ उपयोगकर्ता ऑब्जेक्ट का विस्तार करना है, और इस ऑब्जेक्ट में विधियों और गुणों को जोड़ना है जो ब्लॉगबंडल में उपयोग किए जाने वाले कई मैपिंग में से एक को स्थापित करते हैं। इनमें से कोई भी जारी नहीं है, यह केवल रिश्ते को परिभाषित करता है और मुझे किसी उपयोगकर्ता द्वारा बनाए गए सभी पदों को तर्कसंगत रूप से एक्सेस करने की अनुमति देता है जो ब्लॉग बंडल के भीतर उपयोगकर्ता ऑब्जेक्ट में आवश्यक कार्यक्षमता जोड़कर ब्लॉगबंडल और उपयोगकर्ता बंडल दोनों को लागू करता है (इस प्रकार निर्भरता से परहेज करता है UserBundle से BlogBundle तक)।

जब मैं एक ब्लॉगबंडल \ Entity \ उपयोगकर्ता ऑब्जेक्ट बनाता हूं और UserBundle \ Entity \ User का विस्तार करता हूं तो मुझे @ORM \ Table (name = "usertablename") घोषित करना होगा। यदि मैं नहीं करता, तो BlogBundle \ Entity \ User ऑब्जेक्ट तक पहुंचने का कोई भी प्रयास डेटाबेस तक पहुंचने में विफल रहेगा। चूंकि विस्तारित वस्तु में कोई भी वृद्धि जारी नहीं है, यह बंडलों में ठीक काम करता है। इसके साथ समस्या यह है कि जब मैं "php app/console सिद्धांत: स्कीमा: अद्यतन --force" कहता हूं, तो एक संघर्ष होता है क्योंकि दो इकाइयां & पर नक्शा लगाने का प्रयास करती हैं, वही तालिका बनाते हैं। मैंने ResolveTargetEntityListener सुविधा का उपयोग करने का प्रयास किया है जिसे हाल ही में कार्यान्वित किया गया था लेकिन यह मैप किए गए सुपरक्लास, एसटीआई और सीटीआई के साथ उपयोगकर्ताबुंडल से ब्लॉगबंडल पर निर्भरता को मजबूर करता है।

नीचे मेरे ऑब्जेक्ट्स को मेरे सेटअप को स्पष्ट करने में मदद करने के लिए मेरी ऑब्जेक्ट्स हैं। उन्हें स्पष्टता के लिए संक्षिप्त किया गया है। मुझे एहसास है कि कुछ अर्थशास्त्र सही नहीं हैं लेकिन यह विचार & कॉन्फ़िगरेशन को संवाद करने का इरादा है।

UserBundle \ इकाई \ उपयोगकर्ता

@ORM\Table(name="app_user") 
@ORM\Entity 
class User implements UserInterface 
{ 
    ... 
} 

BlogBundle \ इकाई \ पोस्ट

@ORM\Table(name="app_post") 
@ORM\Entity 
class Post 
{ 
    ... 

    @ORM\Column(name="author_id", type="integer") 
    protected $author_id; 

    @ORM\ManyToOne(targetEntity="\App\BlogBundle\Entity\User", inversedBy="posts") 
    @ORM\JoinColumn(name="author_id", referencedColumnName="id") 
    protected $author; 
} 

BlogBundle \ इकाई \ उपयोगकर्ता

use App\UserBundle\Entity\User as BaseUser 
@ORM\Entity 
@ORM\table(name="app_user") 
class User extends BaseUser 
{ 
    .... 

    @ORM\OneToMany(targetEntity="App\BlogBundle\Entity\Post", mappedBy="author") 
    protected $posts; 

    public function __construct() 
    { 
     parent::_construct(); 

     $this->posts = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    .... 
    /* Getters & Setters, nothing that defines @ORM\Column, nothing persisted */ 
} 

यह काम करता है लेकिन समस्या यह है कि मैं कर रहा हूँ परियोजना में दो इकाइयों को एक ही टेबल पर मैपिंग। विस्तारित ऑब्जेक्ट अपने माता-पिता से @ORM \ table (name = "app_user") को नहीं पकड़ता है, इसलिए इसे BlogBundle \ Entity \ User में परिभाषित किया जाना चाहिए। यदि नियंत्रक से इस ऑब्जेक्ट का कोई संदर्भ डेटाबेस तक नहीं पहुंच पाएगा। चूंकि विस्तारित ऑब्जेक्ट से कुछ भी नहीं टिकता है, इसलिए जब मैं कंसोल से डेटाबेस स्कीमा को अद्यतन करने का प्रयास करता हूं तो कुछ भी तोड़ा नहीं जाता है।

मैं एक यूनिडायरेक्शनल रिलेशनशिप का उपयोग कर सकता हूं, लेकिन यह इस बात को सीमित करता है कि मैं नियंत्रक के भीतर से डेटा तक कैसे पहुंच सकता हूं।

+0

मैं जानता हूँ कि यह एक बहुत पुरानी सवाल यह है कि ; लेकिन क्या आपने कभी इसे हल किया? मुझे एक ही समस्या का सामना करना पड़ रहा है और किसी भी कामकाजी समाधान खोजने के लिए संघर्ष कर रहा हूं। – bigstylee

उत्तर

6

आप इस लिंक में देख सकते हैं विरासत के बारे में पता करने के लिए: http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html#single-table-inheritance

आप में UserBundle \ इकाई \ उपयोगकर्ता की घोषणा करनी चाहिए:

/** 
* @Entity 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"baseuser" = "UserBundle\Entity\User", "blogUser" = "BlogBundle\Entity\User"}) 
*/ 
class User implements UserInterface 
{ 
    ... 
} 

और BlogBundle \ इकाई \ उपयोगकर्ता

use App\UserBundle\Entity\User as BaseUser; 
/** 
* @ORM\Entity 
*/ 
class User extends BaseUser 
{ 
    .... 
} 

सौभाग्य!

+1

मुझे नहीं लगता कि यह एक संतोषजनक समाधान है, क्योंकि उपयोगकर्ता बंडल से '@ DiscriminatorMap' में ब्लॉगबंडल में कोई संदर्भ है। मुझे ऐसे समाधान में दिलचस्पी होगी जहां उपयोगकर्ताबंडल के पास ब्लॉगबंडल पर कोई संदर्भ/निर्भरता नहीं है। – aimfeld

0

मुझे लगता है कि आप इस बंडल दिलचस्प मिल सकता है:

https://github.com/mmoreram/SimpleDoctrineMapping

यह आप मापदंडों क्या फ़ाइलें आपके संस्थाओं मानचित्रण कर रहे हैं, अपने सामान्य बंडलों के हर इकाई को ओवरराइड करने की अनुमति देकर परिभाषित करने के लिए अनुमति देता है।

उदाहरण के लिए:

parameters: 

    # 
    # Mapping information 
    # 
    test_bundle.entity.user.class: "TestBundle\Entity\User" 
    test_bundle.entity.user.mapping_file_path: "@TestBundle/Mapping/Class.orm.yml" 
    test_bundle.entity.user.entity_manager: default 
    test_bundle.entity.user.enable: true 

केवल विपरीत मैं देख रहा हूँ कि आप सभी के लिए अगले संस्थाओं उसी तरह आप विकलांग auto_mapping कारण परिभाषित करने के लिए है कि है ...

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

  • कोई संबंधित समस्या नहीं^_^