2013-03-13 21 views
8

Obecnie pracuję nad projektem Laravel 4 składającym się z serwera głównego i wielu klientów. Klienci tworzą dane i wysyłają je do serwera głównego. Aby uniknąć konfliktów, używam klucza UUID v4 jako klucza podstawowego.Laravel 4: Jak utworzyć dodatkową kolumnę inkrementującą auto z migracjami?

Jednak, gdy dane są tworzone na serwerze chcę przypisać unikalny autoinkrementacja całkowitą więc łatwiej jest dla użytkowników w celu identyfikacji danych. Na przykład: Zamiast mówić o item 5a8e896d-3ab4-48d2-9d39-faeb5227f012 użytkownik może mówić o item #24567

aby moje app zaakceptowania Używam migracje, moja obecna migracja do tej tabeli wygląda następująco:

public function up() 
{ 
    Schema::table('items', function($table) 
    { 
     $table->create(); 
     $table->string('id')->primary(); //'id' For the purpose of keeping the ORM working, this field stores the UUID. 
     $table->integer('number', true); //The human readable item number, the second parameter is true for auto-increment 
     $table->text('otherdata'); 
     $table->timestamps(); 
    }); 
} 

Problemem jest to, że laravel automagicznie tworzy klucz podstawowy podczas definiowania auto-inkrementacji, dlatego migracja kończy się niepowodzeniem, ponieważ istnieją dwa podstawowe klucze.

[Exception] SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key defined 
    (SQL: alter table `items` add primary key items_id_primary(`id`)) (Bindings: array()) 

Czy istnieje jakiś sposób, aby mieć tabeli z kluczem podstawowym i oddzielnym autoinkrementacja polu używając laravel 4 migracje.

Odpowiedz

2

znalazłem problem, laravel wydaje się być utworzenie klucz podstawowy dla każdego pola auto_increment. WHE usunąłem część primary key poprosił mnie o dostarczenie indeksu, więc dzwonię ->unique() na temat migracji, ale to też nie działa. Zmiana return ' auto_increment primary key'; na return ' auto_increment unique'; rozwiązał mój problem, chociaż teraz został zhakowany w rdzeń, co oczywiście jest złą praktyką.

/** 
* Get the SQL for an auto-increment column modifier. 
* 
* @param Illuminate\Database\Schema\Blueprint $blueprint 
* @param Illuminate\Support\Fluent $column 
* @return string|null 
*/ 
protected function modifyIncrement(Blueprint $blueprint, Fluent $column) 
{ 
    if ($column->type == 'integer' and $column->autoIncrement) 
    { 
     return ' auto_increment unique'; //return ' auto_increment primary key'; 
    } 
} 
+2

Nie sądzę, że to jest lepsze rozwiązanie (zmienić podstawową funkcjonalność klasy Db w języku laravel.). –

+1

Gdybyś przeczytał mój komentarz, zrozumiałbyś, że twoje rozwiązanie nie odpowiedziało na moje pytanie. Właśnie dlatego go obniżyłem. Wiem, że moje rozwiązanie nie jest najlepszą praktyką, ale twoja nie rozwiązuje mojego problemu. – christiaanderidder

+0

, więc potrzebujesz dwóch oddzielnych kolumn pierwszej to automatycznie zwiększany klucz podstawowy i inny klucz do uuid. czy mam rację? –

-2

tak można to zrobić w swoim Wzór deklaracji klasy Elementy

class Items extends Eloquent { 
    /** 
* Indicates if the IDs are auto-incrementing. 
* 
* @var bool 
*/ 
public $incrementing = false; 

} 

teraz podstawowy klucz jest nie więcej zwiększane auto pola.

+0

W moim pytaniu stwierdziłem Musiałem jeden inkrementację (bez podstawowej) i jeden klucz podstawowy, jednak laravel wydaje się być stworzenie drugiego klucza podstawowego kiedy zaznaczyć kolumnę, jak autoinkrementacja. W jaki sposób wyłączenie auto increment w modelu (mówię o migracji) zmienia to zachowanie? – christiaanderidder

+5

Jest to przeciwieństwo tego, o co prosił. –

-1

Myślę, że nie da się tego zrobić bez modyfikowania plików podstawowych, ponieważ automatyczne tworzenie przyrostu automatycznie powoduje, że jest to klucz podstawowy.

Lepiej jeśli u może zgłosić to jako błąd w Larvel ramowej dev. zespół.

here Thanks :)

0

Sztuką jest, aby dodać go poza Schema :: tworzyć jak to

Schema::create('payments', function(Blueprint $table) 
{ 
    $table->string('primaryKey', 30); 
    $table->primary('primaryKey'); 
    //... 
}); 
DB::statement('ALTER Table tableName add id INTEGER NOT NULL UNIQUE AUTO_INCREMENT;'); 

Następnie przerobić migracje, klucz stworzy o nazwie id w tabeli następnie TableName możesz uzyskać do niego dostęp, jak każdy inny klucz.