2013-06-24 23 views
5

Sto tentando di usare un UUID come chiave primaria utilizzando laravel 4.laravel LastInsertId con UUID PK

Non trovando molte informazioni su questo argomento ho deciso di utilizzare un trigger in MySQL per impostare la colonna id con un valore di UUID() sull'inserto.

Da quello che ho letto, ho bisogno di impostare un var nel modello di

public $incrementing = false; 

Nelle mie migrazioni presentare Ho qualcosa di simile per ogni tabella:

//set default id to UUID, requires thread_stack in my.cnf to be 196k 
function makeTrigger($tableName) 
{ 
    DB::unprepared('CREATE TRIGGER '.$tableName.'_trigger_id BEFORE INSERT ON '.$tableName.' FOR EACH ROW SET NEW.id = UUID()'); 
} 

$tableName = 'sites'; 
Schema::create($tableName, function($table) 
{ 
    $table->string('id', 36)->primary(); 
    $table->string('name', 50); 
    $table->string('development_url', 50); 
    $table->string('production_url', 50); 
    $table->boolean('launched')->default(0); 
    $table->string('test'); 
    $table->timestamps(); 
    $table->softDeletes(); 
}); 
makeTrigger($tableName); 

Mentre io posso inserire un record come questo che ha un UUID, non posso restituire l'ID se $ incrementing = false è impostato nel modello.

Se rimuovo tale variabile e sto utilizzando un UUID, l'ID restituito è 0. Se utilizzo incrementi ('id') nel file di migrazione, viene restituito l'ID reale.

Sto costruendo un app che UUID per gli ID nelle specifiche, quindi sto cercando di capire se questo è possibile in laravel 4.

Se non sono in grado di ottenere che id indietro con

$user = User::create($userdata); 

return $user->id; 

allora come sarà usato l'id per le relazioni? (Stesso problema con $ user-> save();)

Da quello che ho capito Eloquent si aspetta un auto_incremento indietro, ma sembra che ci dovrebbe essere un modo per recuperare qualsiasi ID.

Perché non funziona?

Qualsiasi comprensione in questo settore sarebbe apprezzata, in quanto non riesco a trovare alcuna documentazione reale su questo argomento.

risposta

7

Ho risolto questo problema utilizzando l'evento creating sul modello per aggiungere un nuovo UUID quando il modello viene salvato. Puoi anche trovare la mia soluzione su packagist.

class BaseModel extends Eloquent { 

    /** 
    * Indicates if the IDs are auto-incrementing. 
    * 
    * @var bool 
    */ 
    public $incrementing = false; 

    /** 
    * The "booting" method of the model. 
    * 
    * @return void 
    */ 
    protected static function boot() 
    { 
     parent::boot(); 

     static::creating(function($model) 
     { 
      $model->{$model->getKeyName()} = (string)$model->generateNewId(); 
     }); 
    } 

    /** 
    * Get a new version 4 (random) UUID. 
    * 
    * @return \Rhumsaa\Uuid\Uuid 
    */ 
    public function generateNewId() 
    { 
     return \Rhumsaa\Uuid\Uuid::uuid4(); 
    } 

} 
+0

Sì ero lo stesso, è un peccato, perché i trigger sembrava davvero bello. – malhal