mysql - generate - table-> uuid('' id '');
Laravel LastInsertId con UUID PK (1)
Lo resolví usando el evento de creating
en el modelo para agregar un nuevo UUID cuando el modelo se guarda. También puede encontrar mi solución en 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();
}
}
Estoy intentando usar un UUID como clave principal usando Laravel 4.
Al no encontrar mucha información sobre este tema, decidí usar un disparador en MySQL para establecer la columna de identificación con un valor de UUID () en la inserción.
Por lo que he leído, necesito establecer una var en el modelo de
public $incrementing = false;
En mi archivo de migraciones, tengo algo como esto para cada tabla:
//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);
Si bien puedo insertar un registro como este que tiene un UUID, no puedo devolver el ID si $ incrementing = false está establecido en el modelo.
Si elimino esa var y estoy usando un UUID, la identificación devuelta es 0. Si uso incrementos (''id'') en el archivo de migraciones, obtengo la identificación real devuelta.
Estoy construyendo una aplicación que UUID para identificadores en la especificación, por lo que estoy tratando de averiguar si esto es posible en Laravel 4.
Si no puedo recuperar esa identificación usando
$user = User::create($userdata);
return $user->id;
entonces, ¿cómo se usará el id para las relaciones? (Mismo problema usando $ user-> save ();)
Por lo que entiendo, Eloquent espera un autoincremento, pero parece que debería haber una forma de recuperar la identificación.
¿Por qué no funciona esto?
Cualquier visión sobre esta área sería apreciada, ya que no puedo encontrar ninguna documentación real sobre este tema.