2012-04-08 10 views
7

मैं एक विरासत PHP अनुप्रयोग को सिम्फनी 2 में परिवर्तित करने की प्रक्रिया में हूं। आवेदन डेटा इस समय बहुत संगत नहीं है, इसलिए मैं विदेशी कुंजी बाधाओं को बचना चाहता हूं। मैं अपने "उत्पाद" इकाई कक्षा में निम्नलिखित एनोटेशन है:विदेशी कुंजी बाधाओं के बिना सिद्धांत 2 एसोसिएशन

class Product { 

    // some definitions 

    /** 
    * @ORM\ManyToOne(targetEntity="Manufacturer") 
    * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id") 
    */ 
    private $Manufacturer; 
} 

जब मैं app/console doctrine:schema:update करते हैं, मैं एसक्यूएल आदेश

ALTER TABLE products ADD CONSTRAINT FK_F6FA18741C3BF575 
    FOREIGN KEY (manufacturer_id) REFERENCES manufacturer(id); 

मैं यह कैसे बच सकते हैं मिल सकता है?

उत्तर

6

असल में आप एसक्यूएल कमांड को उत्पन्न होने से नहीं रोक सकते हैं। कम से कम सिद्धांत कोड में डाइविंग के बिना नहीं।

हालांकि, आपको वास्तव में अपने डेटाबेस में बाधाओं को लागू करने की आवश्यकता नहीं है। डी 2 उनके बिना ठीक काम करेगा।

+0

हाँ लेकिन फिर मैं आदेश 'एप्लिकेशन/कंसोल सिद्धांत का उपयोग नहीं कर सकते हैं: --force' अब और अद्यतन क्योंकि अद्यतन बंद हो जाता है जब यह निष्पादित करने के लिए कोशिश करता है निम्न क्वेरी आप डेटासेट से आईडी बदलने के लिए देता है एफके बाधाएं। – chiborg

0

आपको कई टोमनी और जॉइन कॉलम परिभाषाओं को छोड़ना चाहिए और अपने कस्टम उत्पाद भंडार में निर्माता संपत्ति को सार्वजनिक रूप से प्राप्त करने के लिए मैन्युफैक्चरर विधि है जो ऑटो जेनरेटेड उत्पाद भंडार को बढ़ाती है।

0

मुझे एक ही आदेश के साथ समस्या थी।

SQLSTATE[HY000]: General error: 1005 Can't create table 'xxx.#sql-66c_3e' (errno: 150)

मेरे लिए यह अनूठा (अपने मामले आईडी में) के रूप में स्तंभ घोषित करने के लिए मदद की: मैं अपवाद मिला है।

अब app/console doctrine:schema:update फिर से ठीक चलाता है।

12

मुझे हाल ही में एक ही प्रक्रिया से गुज़रना पड़ा और सौभाग्य से एक आसान समाधान है, बस कॉलम की एनोटेशन में nullable=true जोड़ें।

यह तब तक काम करेगा जब तक कि मौजूदा डेटा मान्य नहीं है, मेरे मामले में मुझे 0 के नल में बदलना था और उन कुंजियों को बदलना था जो अब न्यूल में मौजूद नहीं थे।

+0

यह स्वीकार्य उत्तर –

+5

होना चाहिए, मैंने इसे अपने 'जॉइन कॉलम' एनोटेशन में जोड़ा लेकिन विदेशी कुंजी बाधा अभी भी बनाई जा रही है। – flu

+1

@flu के समान ही नहीं - कोई किस्मत नहीं, विदेशी कुंजी किसी भी तरह से बनाई जा रही है –

-1

कोशिश onDelete = "CASCADE" जोड़ने के लिए की तरह

* @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id", onDelete="CASCADE") 
0

आप खो विदेशी कुंजी को शून्य पर सेट करने के लिए, तो आप अपने contstraint सेट कर सकते हैं। स्कीमा:

select p.id from product p 
left join manufacturer m on m.id=p.manufakturer_id 
where m.id is null 
संबंधित मुद्दे