2013-08-25 11 views
8

Witam Mam problem z utworzeniem tabeli za pomocą narzędzia do tworzenia schematów migracji. Wystąpił problem z tabelą z samodzielnym odwołaniem klucza obcego. Oto kod, który produkują błąd:Laravel - migracja, samoreferencja, klucz obcy, wydanie,

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

Tutaj jest błąd:

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

gory add constraint cb_category_parent_id_foreign foreign key ( parent_id ) references cb_category ( id`) na del ete Kaskada na uaktualnienia kaskadzie) (Wiązania: array ( ))

[Wyjątek PDOE] SQLSTATE [HY000]: Błąd ogólny: 1005 Nie można utworzyć tabeli "eklik2." sql-7d4_e '(errno: 150)

Każdy pomysł?

Odpowiedz

5

Musisz podzielić to na dwa bloki schematów, jeden tworzy kolumny, a drugi dodaje FK. mysql nie może wykonywać obu naraz w tym samym czasie.

+0

muszę złamać go w 2 wypowiedzi , w każdym razie błąd pozostaje: Schemat :: utwórz (...); Schemat :: table ('cb_category', function ($ table) { $ table-> foreign ('parent_id') -> reference ('id') -> on ('cb_category') -> onUpdate ('kaskada ') -> onDelete (' cascade '); }); – gandra404

+1

Rozwiązany z łamaniem. Oto kod: Schemat :: 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) REFERENCJE cb_category (id) ON DELETE NO ACTION ON UPDATE NO ACTION"); – gandra404

2

może być zbyt późno na imprezę, ale oficjalne docs twierdzą, że klucz obcy, w przypadku całkowitej, musi być ->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.

Również Artisan nie powiedzie się, jeśli Ty (tak jak ja) pomyłkę unsigned() i spędziłem sporo godzin próbując dowiedzieć się, dlaczego klucz nie został stworzony.

więc dwie rzeczy: 1. Zawsze kolumna klucz obcy bez znaku w przypadku zwiększając całkowite 2. Sprawdź pisownię 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'); 
    }); 

Spróbuj

+0

Ma to ten sam problem, co w pytaniu. Nie można utworzyć tabeli odwołującej się do siebie podczas jej tworzenia, ponieważ tabela nie istnieje dla odniesienia podczas tworzenia, – Jason