2013-08-25 95 views
8

您好我有一個使用遷移架構生成器創建表的問題。 問題出現在具有自引用外鍵的表中。 這裏是其產生錯誤的代碼:Laravel遷移自引用外鍵問題

 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'); 
    }); 

以下是錯誤:

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級聯PARENT_ID ) references cb_category ( id`)上更新級聯)(綁定:陣列( ))

[PDOException] SQLSTATE [HY000]:一般錯誤:1005無法創建表'eklik2。# sql-7d4_e'(errno:150)

任何想法?

回答

5

您必須將其分解爲兩個模式塊,一個創建列,另一個添加FK。 mysql不能同時執行這兩個操作。

+0

我打破它在2個語句,無論如何錯誤依然存在: Schema :: create(...); ('cb_category') - > onUpdate('cascade)'('cb_category') - >參考('id') - >外部('parent_id') - ') - > onDelete('cascade'); }); – gandra404

+1

解決打破。這裏是代碼: Schema :: create('cb_category',function($ table){...}); $ dbh = DB :: getPdo(); $ dbh-> query(「ALTER TABLE cb_category ADD CONSTRAINT fk_cb_category_parent_id FOREIGN KEY(parent_id)REFERENCES cb_category(id)ON DELETE NO ACTION ON UPDATE NO ACTION」); – 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.

此外,工匠不失敗,如果你(因爲我)拼寫錯誤unsigned(),我花了好幾個小時試圖找出爲什麼沒有創建密鑰。

所以兩件事情:1。 始終使外鍵列在未簽名的情況下,增加的整數 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