2016-03-04 15 views
6

Ho una tabella mysql in cui sto usando un UUID come chiave primaria. Ecco la migrazione creazione:La chiave primaria UUID nel modello Eloquent è memorizzata come uuid ma restituisce come 0

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

che genera il seguente schema di 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; 

Nel mio modello Eloquente Ho un metodo per la creazione di un'istanza che richiede un metodo per generare l'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)); 
    } 

} 

Quando creo una nuova istanza di modello, la memorizza nel database:

uuids stored

Ma quando provo ad accedere al nuovo id dell'istanza:

creating new instance and dumping id

Restituisce come 0:

returned result

Che cosa mi manca qui?

risposta

8

Nevermind, ho trovato la risposta dopo la ricerca attraverso la documentazione: https://laravel.com/docs/5.2/eloquent#eloquent-model-conventions

nella sezione "chiavi primarie" c'è un piccolo trafiletto:

Inoltre, eloquente presuppone che la chiave primaria è un incremento del valore intero. Se si desidera utilizzare una chiave primaria non incrementale, è necessario impostare la proprietà di incremento $ sul modello su false.

Se si sta utilizzando un UUID, è necessario impostare questa proprietà su false. Una volta che l'ho fatto nella parte superiore del mio modello ha funzionato.

Poiché tutti i miei modelli useranno gli UUID, ho estratto la logica UUID in una classe padre. Ecco come appare:

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)); 
    } 
} 
Problemi correlati