2013-05-27 5 views
7

के साथ एक इकाई को हटा नहीं सकता है, एक इकाई को हटाने की कोशिश करते समय मुझे एक विदेशी बाधा उल्लंघन मिल रहा है, जिसमें यूनिडायरेक्शनल एक से कई संगठन शामिल हैं।सिद्धांत 2 - एक यूनिडायरेक्शनल एक टॉनी रिलेशन

class Dealer{ 

/** 
* @ManyToMany(targetEntity="Car", cascade={"persist", "remove"}) 
* @JoinTable(name="dealer_cars", 
*  joinColumns={@JoinColumn(name="dealer_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@JoinColumn(name="car_id", referencedColumnName="id", 
     unique=true)} 
* ) 
**/ 
    protected cars; 
} 

Car वस्तु इस मामले में उसके मालिक को एक रिश्ता (इसलिए यूनिडायरेक्शनल संबंध) नहीं होने चाहिए: मैं निम्नलिखित सरल वर्ग की है। अगर मैं कारों के लिए संघों से युक्त एक Dealer वस्तु को हटाने का प्रयास, मैं निम्नलिखित बाधा उल्लंघन मिलती है:

Cannot delete or update a parent row: a foreign key constraint fails 
(`application`.`dealer_cars`, CONSTRAINT `FK_E1BCEEEBC3C6F69F` 
FOREIGN KEY (`car_id`) REFERENCES `car` (`id`))' 

मैं अगर मैं डेटाबेस तालिका से मैन्युअल रूप से डीलर पंक्ति को हटाने का प्रयास वही संदेश मिल रहा है, लेकिन मैंने सोचा था कि कैस्केड = "निकालें" का उपयोग करते हुए सिद्धांत, मेरे लिए इसका ख्याल रखेगा।

यदि मैं एक बिडरेक्शनल एसोसिएशन में एसोसिएशन बदलता हूं तो यह काम करता है। यह यूनिडायरेक्शनल एसोसिएशन के साथ क्यों काम नहीं करता है?

+0

यूनिडायरेक्शनल एक-से-कई संघ? यह मेरे लिए कई-द्वि-दिशात्मक की तरह दिखता है: डी क्या आपने अपना डेटाबेस छोड़ दिया और फिर से बनाया या क्या आपने स्कीमा को बदलते समय डेटाबेस में कोई फिक्स्चर/डेटा-बचे हुए हैं? – nifr

+0

आप कार के खोए बिना डीलर को हटाना चाहते हैं, क्या मुझे यह अधिकार मिलता है? – nifr

+1

यह सिद्धांतों को एक-दूसरे के लिए एक-दूसरे की परिभाषा है। यह एक अद्वितीय बाधा के साथ कई से अधिक है। मैं कार को हटाना चाहता हूं, जब डीलर भी हटा दिया जाता है। –

उत्तर

13

here से सिद्धांत

@ORM\JoinColumn(name="dealer_id", referencedColumnName="id", onDelete="SET NULL") 

स्पष्टीकरण के साथ डाटाबेस स्तर onDelete विकल्प का उपयोग करें:

  • CASCADE परिवर्तन को प्रचारित जाएगा जब मूल परिवर्तनों। (यदि आप पंक्ति को हटाते हैं, तो उस पंक्ति को संदर्भित करने वाली बाध्य तालिकाओं में पंक्तियां भी हटा दी जाएंगी, आदि)
  • SET NULL कॉलम मान को NULL पर सेट करता है जब कोई मूल पंक्ति समाप्त हो जाती है।

  • RESTRICT विफल होने के लिए अभिभावक पंक्ति के DELETE को प्रयास करने का कारण बनता है।


... अद्यतन यह शिकायत करने से पहले अपने डेटाबेस स्कीमा :-) काम नहीं कर रहा

app/console doctrine:schema:update --force 

इस करता है, तो विदेशी कुंजी त्रुटियों के कारण काम नहीं कर रहा जाना मुश्किल तरीके से (इस क्रम में):

  • एप्लिकेशन/कंसोल सिद्धांत: डेटाबेस: ड्रॉप
  • ,210
  • एप्लिकेशन/कंसोल सिद्धांत: डेटाबेस: बनाने
  • एप्लिकेशन/सिद्धांत कंसोल: स्कीमा: अद्यतन --force
  • (वैकल्पिक: एप्लिकेशन/कंसोल सिद्धांत: जुड़नार: लोड)
+0

हाँ, यह था। मुझे लगता है कि "सेट न्यूल" बस "कैस्केड" के साथ काम करेगा।इस के लिए –

+1

+1 और स्कीमा को रिक्त करने के लिए याद रखें! :) –

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