2013-08-25 6 views
8

हाय मुझे माइग्रेशन स्कीमा बिल्डर का उपयोग करके एक टेबल बनाने में समस्या है। समस्या कुंजी विदेशी संदर्भ के साथ तालिका के साथ होती है।लार्वा माइग्रेशन स्वयं संदर्भित विदेशी कुंजी समस्या

SQLSTATE[HY000]: General error: 1005 Can't create table 'eklik2.#sql-7d4_e' (errno: 150) (SQL: alter table `cb_cate 

रक्तमय add constraint cb_category_parent_id_foreign foreign key ( डेल ete झरना पर ) references cb_category ( id`) PARENT_ID अद्यतन झरना पर) (बाइंडिंग:

 Schema::create('cb_category', function($table) 
    { 
     $table->integer('id')->primary()->unique()->unsigned(); 
     $table->integer('domain_id')->unsigned(); 
     $table->foreign('domain_id')->references('id')->on('cb_domain'); 
     $table->integer('parent_id')->nullable(); 
     $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); 
     $table->string('name'); 
     $table->integer('level'); 
    }); 

यहाँ त्रुटि है: यहाँ कोड है जो उत्पादन त्रुटि है सरणी ( ))

[पीडीओएक्सप्शन] एसक्यूएलएसटीएटी [एचवाई 000]: सामान्य त्रुटि: 1005 तालिका 'eklik2 नहीं बना सकता। # sql-7d4_e '(errno: 150)

कोई विचार?

उत्तर

5

आपको इसे दो स्कीमा ब्लॉक में तोड़ना है, एक स्तंभ बना रहा है, दूसरा एफके जोड़ रहा है। MySQL एक ही समय में दोनों नहीं कर सकता है।

+0

मेरे पास 2 बयान में इसे तोड़ने की कोशिश करो , वैसे भी त्रुटि बनी हुई है: स्कीमा :: बनाएं (...); स्कीमा :: तालिका ('cb_category', फ़ंक्शन ($ तालिका) { $ तालिका-> विदेशी ('parent_id') -> संदर्भ ('id') -> ऑन ('cb_category') -> ऑन अपडेट ('कैस्केड ') -> ऑनडेले (' कैस्केड '); }); – gandra404

+1

तोड़ने के साथ हल हो गया। यहां कोड है: स्कीमा :: बनाएं ('cb_category', फ़ंक्शन ($ तालिका) {...}); $ डीबीएच = डीबी :: getPdo(); $ dbh-> क्वेरी ("वैकल्पिक तालिका cb_category कंसस्ट्रेंट जोड़ें fk_cb_category_parent_id विदेशी कुंजी (parent_id) संदर्भ cb_category (आईडी) अद्यतन पर कोई कार्रवाई निष्कासित नहीं करें"); – gandra404

2

मैं पार्टी के लिए बहुत देर हो चुकी हो सकता है, लेकिन सरकारी डॉक्स का दावा है कि विदेशी कुंजी, पूर्णांक के मामले में, होना चाहिए ->unsigned();

http://laravel.com/docs/4.2/schema#foreign-keys

Note: When creating a foreign key that references an incrementing integer, remember to always make the foreign key column unsigned.

इसके अलावा, कारीगर अगर विफल नहीं आप (जैसा कि मेरे पास है) misspell unsigned() और मैंने यह पता लगाने की कोशिश में कुछ घंटों बिताए हैं कि कुंजी क्यों नहीं बनाई गई थी।

तो दो बातें: 1. हमेशा विदेशी कुंजी स्तंभ अहस्ताक्षरित मामले में incrementing पूर्णांक बनाने 2. unsigned()

1
Schema::create('cb_category', function (Blueprint $table) { 
     $table->increments('id')->unsigned(); 
     $table->integer('domain_id')->unsigned(); 
     $table->foreign('domain_id')->references('id')->on('cb_domain'); 
     $table->integer('parent_id')->nullable(); 
     $table->foreign('parent_id')->references('id')->on('cb_category')->onUpdate('cascade')->onDelete('cascade'); 
     $table->string('name'); 
     $table->integer('level'); 
    }); 

की वर्तनी इस

+0

इस प्रश्न में एक ही समस्या है। एक तालिका को स्वयं को संदर्भित करने के लिए नहीं बनाया जा सकता है क्योंकि यह बनाया गया है, क्योंकि तालिका बनाई जा रही है जब संदर्भ में संदर्भ मौजूद नहीं है, – Jason

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