2013-06-12 11 views
11

muszę dwa klucze złożone i tylko trzeba być AUTO INCREMENT co starałem dotąd:klucze Composite laravel schematu budowniczy

// first try 
Schema::create("kitchen", function($table) { 
       $table->increments('id'); 
       $table->integer('restaurant_id'); 
       $table->primary(array('id', 'restaurant_id')); 
       $table->string('name'); 
      }); 
// second try 
Schema::create("kitchen", function($table) { 
       $table->increments('id'); 
       $table->integer('restaurant_id'); 
       $table->primary('restaurant_id'); 
       $table->string('name'); 
      }); 

Żaden działa. Komunikat o błędzie:

[Exception]
SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary ke
y defined (SQL: alter table
kuchnia add primary key kitchen_restaurant_id
_primary(
restaurant_id )) (Bindings: array (
))

Rozwiązanie bez Schema budowniczego: po pierwsze, muszę dodać dwa klucze złożone, a potem muszę zrobić jedną z AUTO INCREMENT ale myślę Schema budowniczy nie może Zrób to.

Uwaga: mogę to zrobić z SQL, to znaczy nie ma problemu z MySQL

Wszelkie sugestie?

Podsumowanie:

Co potrzebne jest;

http://oi39.tinypic.com/es91ft.jpg

z Schema budowniczy

Odpowiedz

1

Wydaje się pan uderzyć coś, co nie jest obecnie możliwe ze laravel, ponieważ ->increments() już ustawia ->primary(), więc kiedy go dodać się skończyć z dwóch PRIMARY klauzul w wynikowym SQL.

Ale może warto spróbować stworzyć tabelę z niewłaściwego klucza podstawowego, zrzucając go, a następnie odtworzyć go:

Schema::create("kitchen", function($table) 
{ 
    $table->increments('id'); 
    $table->integer('restaurant_id'); 
    $table->string('name'); 
}); 

Schema::table('kitchen', function($table) 
{ 
    $table->dropPrimary('kitchen_id_primary'); 
}); 

Schema::table('kitchen', function($table) 
{ 
    $table->primary(array('id', 'restaurant_id')); 
}); 
+0

, ale nie mogę zrobić '' AUTO_INCREMENT' id' ponownie, może JA ? –

+0

'$ table-> increments ('id');' sprawi, że będzie to autoinc + klucz podstawowy, ale '$ table-> dropPrimary ('kitchen_id_primary');' usunie tylko klucz podstawowy. Tak więc pole pozostanie autoinc. Następnie '$ table-> primary (array ('id', 'restaurant_id'));' ponownie utworzy złożony klucz podstawowy. –

+0

nie może spaść podstawową jeśli auto inc jest ustawiony – silkAdmin

10

Można to zrobić z małą pomocą nieprzygotowanego metody:

Schema::create("kitchen", function($table) { 
    $table->increments('id'); 
    $table->integer('restaurant_id'); 
    $table->string('name'); 
}); 

DB::unprepared('ALTER TABLE `kitchen` DROP PRIMARY KEY, ADD PRIMARY KEY ( `id` , `restaurant_id`)'); 

To jest testowane i działa!

Wiem, że to trochę za późno, a może zostały przeniesione, ale ktoś inny może natknąć się to :)

1

inną opcję z Dayle Rees

Schema::create('example', function($table) 
{ 
    $table->integer('id'); 
    $table->string('username'); 
    $table->string('email'); 
    $keys = array('id', 'username', 'email'); 
    $table->primary($keys); 
}); 
+2

To nie czyni 'id'' AUTO INCREMENT' –

+0

Ładne rozwiązanie dla nieautomatycznych inkrementów id. – schellingerht

5

przyrostach wymowny jest() ustawia kolumny jako liczba całkowita bez znaku. Mając to na uwadze, masz wiele sposobów na osiągnięcie pożądanych kluczy złożonych.

Można użyć interger() lub unsignedInteger() i ustawienie autoIncrements true:

$table->integer($column, $autoIncrement = false, $unsigned = false); 

$table->unsignedInteger($column, $autoIncrement = false); 
//Returns $this->integer($column, $autoIncrement, true); 

Wtedy można powiedzieć, elokwentny, które są twoje podstawowe klawisze przez pierwotne().

schematu :: create() powinna wyglądać następująco:

Schema::create('kitchen', function($table) { 
    $table->integer('id', true, true); 
    $table->integer('restaurant_id')->unsigned(); //or $table->integer('restaurant_id', false, true); 
    $table->foreign('restaurant_id') 
      ->references('id')->on('restaurants') 
      ->onDelete('cascade'); 
    $table->string('name'); 
    $table->primary(array('id', 'restaurant_id')); 
}); 

Zakładając tabela Restauracja korzysta $ RTV-> przyrosty ('id') powinno to zrobić 'id' i 'restaurant_id' Twoje klucze podstawowe, a jednocześnie pasujące do "id restauracji" do tabeli "id" restauracji.

1

Nie ma sensu posiadanie autoinkrecji jako części złożonego klucza podstawowego, ponieważ i tak będzie ona unikalna dla każdego rekordu. Jeśli chcesz autoIncrement klucz podstawowy i unikatowy klucz kompozytowego na przykład 2 innych kolumn, takich jak „restaurant_id” i „name”:

Schema::create("kitchen", function($table) 
{ 
    $table->increments('id'); 
    $table->integer('restaurant_id'); 
    $table->string('name'); 
    $table->unique(['restaurant_id', 'name']); 
}); 
Powiązane problemy