2012-03-28 10 views
11

इससे पहले कि मैं अपनी समस्या का वर्णन, यह वास्तव में यह स्पष्ट कर सकता है अगर मैं त्रुटि मैं हो रही है के साथ शुरू:सिद्धांत कई-से-अनेक संबंध जब मैं एक प्रवास बनाए जाने वाली तालिका में दो बार बनाना चाहता है

$ ./app/console doc:mig:diff 

    [Doctrine\DBAL\Schema\SchemaException]     
    The table with name 'user_media_area' already exists. 

यह बिल्कुल सही है - user_media_area मौजूद है। मैंने इसे पिछले माइग्रेशन में बनाया है और मुझे समझ में नहीं आता क्यों सिम्फनी टेबल को फिर से बनाने की कोशिश कर रहा है।

मेरी समस्या में कई से अधिक रिश्तों के साथ कुछ करना है। मेरे पास user नामक एक टेबल है, जिसे media_area नामक एक तालिका और user_media_area नामक एक तालिका है।

यहाँ कोड मैं कहाँ बता user के बारे में media_area (Entity/User.php) है:

/** 
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas") 
* @JoinTable(name="user_media_area", 
*  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@JoinColumn(name="media_area_id", referencedColumnName="id")} 
*  ) 
*/ 
private $mediaAreas; 

और यहाँ है, जहां मैं media_area के बारे में user (Entity/MediaArea.php) बता:

/** 
* @ORM\ManyToMany(targetEntity="User", mappedBy="users") 
*/ 
private $users; 

दिलचस्प बात यह है कि अगर मैं हटा दें कि है JoinTableEntity/User.php, ./app/console doctrine:migrations:diff से सामान फिर से काम करेगा:

/** 
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas") 
*/ 
private $mediaAreas; 

हालांकि, यह एक छोटे से बंद है: यह अब एक नई तालिका mediaarea कहा जाता है बनाने के लिए, है जो मैं नहीं चाहता चाहता है। मेरी तालिका पहले से मौजूद है और इसे media_area कहा जाता है।

तो यह किसी भी तरह से की तरह दिखता है, Symfony मेरी User कक्षा में इस ManyToMany बात के आधार पर एक तालिका बनाने के लिए कोशिश कर रहा है, और एकमात्र कारण समस्या दूर हो जाने जब मैं हटाने JoinTable कि तालिका के नाम यह चाहता है बनाने के लिए (mediaarea) अब मेरी तालिका के वास्तविक नाम से मेल नहीं खाता है (media_area)।

तो मेरा प्रश्न है: यह बिल्कुल एक नई टेबल क्यों बनाना चाहता है? मैं क्या गलत कर रहा हूं?

(मैं जानता हूँ कि यह संभव है कि मेरी नामकरण सम्मेलनों के लिए रवाना। Symfony और सिद्धांत के डाटाबेस उदाहरण बहु अवधि स्तंभ नाम है frustratingly रहित हैं, इसलिए मैं हमेशा पता नहीं है अगर मैं media_area या mediaArea क्या करना चाहिए हूँ।)

उत्तर

4

आधिकारिक दस्तावेज़ों पर Association Mapping व्याख्या के अनुसार, @JoinColumn और @JoinTable परिभाषाएँ आमतौर पर वैकल्पिक हैं और समझदार डिफ़ॉल्ट मान है, किया जा रहा है:

name: "<fieldname>_id" 
referencedColumnName: "id" 

से हम निष्कर्ष निकाल सकते हैं कि है कि वहाँ वास्तव में आपके द्वारा प्रस्तुत किए गए दो कार्यान्वयन के बीच कोई ठोस अंतर है।

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

बारे में तालिका नाम मुद्दा, सिद्धांत 2 के डिफ़ॉल्ट व्यवहार को इस बारे में:

/** 
* @ORM\ManyToMany(targetEntity="MediaArea", inversedBy="mediaAreas") 
*/ 
private $mediaAreas; 

कोशिश करते हैं और एक मेज mediaarea कहा जाता है बनाने के लिए है। फिर, पूरी तरह से सामान्य।

आप एक इकाई की मेज के लिए एक विशिष्ट नाम घोषित करने के लिए चाहते हैं, तो आप इस करना चाहिए:

/** 
* @ORM\Table(name="my_table") 
*/ 
class Something 

मुझे यकीन है कि अगर है कि तुम सब पर मदद करता है नहीं कर रहा हूँ, लेकिन मैं इसे डालता है लगता है, कम से कम, सही रास्ते पर।

+3

यह उत्तर के रूप में क्यों चिह्नित किया गया है? यह ओपी के सवाल का जवाब नहीं देता है कि इस त्रुटि को दिखाने से सिद्धांत को कैसे रोकें। इसे जोड़ने पर मुझे सिद्धांत \ सामान्य \ एनोटेशन \ एनोटेशन अपवाद मिला: [अर्थात् त्रुटि] एनोटेशन @ORM \ तालिका को संपत्ति पर घोषित करने की अनुमति नहीं है उपयोगकर्ता :: $ मीडिया एरिया। आप इन कोड तत्वों पर केवल इस एनोटेशन का उपयोग कर सकते हैं: क्लास। – jaycode

+0

आप संपत्ति स्तर पर '@ ORM/Table' एनोटेशन डालने का प्रयास कर रहे हैं, जबकि इसे कक्षा स्तर पर रखा जाना चाहिए। त्रुटि में सवाल या उत्तर के साथ कुछ लेना देना नहीं है। –

+0

सही एनोटेशन @ ORM/JoinTable – luliandro

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