2011-12-13 18 views
7

के कारण फिक्स्चर लोड नहीं कर सकता है मेरे पास एक कंपनी इकाई है जहां प्रत्येक कंपनी के पास पदानुक्रमित वृक्ष संरचना में एक और मूल कंपनी है।Symfony2, DoctrineFixturesBundle, विदेशी कुंजी बाधा

सबकुछ एप्लिकेशन में ठीक काम करता है, इसलिए मुझे यकीन है कि मेरी इकाई कक्षाएं सही हैं।

समस्या डेटाबेस में पहले से ही सामग्री तो

doctrine:fixtures:load 

कर वहाँ है अगर है, तो यह त्रुटि देता है: जुड़नार काटना है:

[PDOException]                                                            
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails 

इम काफी यकीन है कि समस्या लोड करता है तालिका, लेकिन यह त्रुटि प्राप्त किए बिना यह नहीं कर सकता।

मुझे यकीन नहीं है कि शुद्ध करने से पहले महत्वपूर्ण बाधाओं को अक्षम करने के लिए सिद्धांत में कुछ हैकिंग किए बिना इसे कैसे हल किया जाए। वास्तव में एक दीर्घकालिक समाधान नहीं है।

डेटा संरचना में अन्य संबंध समस्या का कारण नहीं बनते हैं क्योंकि समस्याओं से बचने के लिए सिद्धांत सही क्रम में शुद्ध होना प्रतीत होता है, लेकिन कंपनी तालिका स्वयं संदर्भित होने पर यह खत्म हो जाती है।

मेरी इकाई है।

class Company 
{ 
/** 
* @var integer $id 
* 
* @ORM\Id 
* @ORM\Column(name="id", type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @var string $name 
* @ORM\Column(type="string", length=100) 
*/  
protected $name; 

/** 
* @ORM\ManyToOne(targetEntity="Company", inversedBy="children") 
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id") 
*/ 
protected $parent; 

/* other properties here..... */ 

} 

का उपयोग कर इम Symfony 2.0.7 और नवीनतम deps, और MySQL 5.5

उत्तर

16

मैं बस ठीक से OnDelete के व्यवहार स्थापित करने के लिए की जरूरत है।

यह RESTRICT को डिफ़ॉल्ट करता है, जो त्रुटि को फेंकने की व्याख्या करता है। स्पष्ट रूप से इसे CASCADE या SET NULL पर सेट करने से सिद्धांत को बिना किसी त्रुटि के तालिका को खाली करने की अनुमति मिलती है।

मेरे मामले में मैं बच्चों को हटाने का कारण बनने के लिए माता-पिता को हटाना नहीं चाहता था, इसलिए मैंने सेट न्यूल का उपयोग किया ताकि संबंधों को इसके बजाय हटा दिया जाएगा।

/** 
* @ORM\ManyToOne(targetEntity="Company", inversedBy="children") 
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="set null") 
*/ 
protected $parent; 
+0

मेरे पास एक अलग त्रुटि संदेश था: * पहचानकर्ता [...] [...] \ Entity \ [...] * की एक क्वेरी के लिए गायब है। यह जवाब समाधान था, यह अभी भी मान्य है, तीन साल बाद (और सिम्फनी 2.3.25 के साथ)। धन्यवाद! –

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