2013-08-25 42 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 ( PARENT_ID ) references cb_category ( id`)デル ETEカスケード更新カスケード上に)(バインディング:配列( ))

[PDOException] SQLSTATE [HY000]:一般的なエラー:1005テーブル 'eklik2を作成できません。# sql-7d4_e '(errno:150)

ご存知ですか?

答えて

5

これを2つのスキーマブロックに分割する必要があります.1つは列を作成し、もう1つはFKを追加することです。 mysqlは同時に両方を行うことはできません。

+0

を試してみてくださいインクリメント整数の場合には、外部キー列が符号なしにしますとにかく、エラーは残ります: スキーマ:: create(...); onUpdate( 'cascade(' cb_category ')) - >(' cb_category ') - >参照(' 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)参照cb_category(id)NO 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'); 
    }); 

のスペルが、私は2文でそれを破る必要があり、この

+0

これは、問題と同じ問題があります。テーブルは作成時に参照するために存在しないため、テーブルが作成されたときにそのテーブルを参照することはできません。 – Jason