2016-03-04 35 views
6

Mam tabelę mysql, w której używam identyfikatora UUID jako klucza podstawowego. Oto migracja utworzenia:Klucz podstawowy UUID w modelu wymownym jest przechowywany jako uuid, ale zwraca jako 0

Schema::create('people', function (Blueprint $table) { 
    $table->uuid('id'); 
    $table->primary('id'); 
    ... 
    $table->timestamps(); 
} 

który generuje następujący schemat MySQL:

CREATE TABLE `people` (
    `id` char(36) COLLATE utf8_unicode_ci NOT NULL, 
    ... 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

W moim wymowny modelu mam metodę tworzenia instancji, który wywołuje metodę generowania UUID:

class Person extends Model 
{ 
    protected $fillable = [ 
     ... 
    ]; 

    public function make(array $personData){ 
     $person = new Person; 
     $person->setUUID(); 
     collect($personData)->each(function ($value, $columnName) use($person){ 
      if(in_array($columnName, $this->fillable)){ 
       $person->{$columnName} = $value; 
      } 
     }); 
     $person->save(); 
     return $person; 
    } 

    protected function setUUID(){ 
     $this->id = preg_replace('/\./', '', uniqid('bpm', true)); 
    } 

} 

Po utworzeniu nowej instancji modelu można ją zapisać w bazie danych:

uuids stored

Ale gdy próbuję otworzyć nowy identyfikator instancji:

creating new instance and dumping id

powraca jako 0:

returned result

Co ja tu brakuje?

Odpowiedz

8

Nevermind znalazłem odpowiedź po przeszukując docs: https://laravel.com/docs/5.2/eloquent#eloquent-model-conventions

w sekcji "Primary Keys" jest trochę blurb:

Ponadto, elokwentny zakłada, że ​​klucz podstawowy jest inkrementacja wartości całkowitej. Jeśli chcesz użyć nieinwazyjnego klucza podstawowego, musisz ustawić właściwość $ incrementing w modelu na wartość false.

Jeśli zamierzasz używać UUID, musisz ustawić tę właściwość na false. Kiedy zrobiłem to na górze mojego modelu, zadziałało.

Ponieważ wszystkie moje modele będą używać identyfikatorów UUID, wyodrębniłem logikę UUID do klasy nadrzędnej. Oto, jak to wygląda:

class UuidModel extends Model 
{ 

    public $incrementing = false; 

    /** 
    * Sets the UUID value for the primary key field. 
    */ 
    protected function setUUID() 
    { 
     $this->id = preg_replace('/\./', '', uniqid('bpm', true)); 
    } 
}