Cuando trabajamos con Laravel, lo más común es usar el campo
id como llave primaria autoincremental. Sin embargo, en algunos casos conviene utilizar UUIDs (Universally Unique Identifier), ya sea como primary key o como un identificador alterno para exponer públicamente sin comprometer el id interno.En esta publicación veremos:
📌 Cuándo usar UUID como llave primaria.
📌 Cuándo usar UUID como un identificador adicional.
📌 Cómo agregarlos en las migraciones.
📌 Cómo crear un Trait en Laravel para automatizarlo.
1. UUID como llave primaria
Usar UUID como
primary key es útil cuando:Tu sistema es distribuido o con microservicios.
Quieres evitar colisiones de IDs entre entornos.
Necesitas ocultar la secuencia numérica para mayor seguridad.
Ejemplo de migración con UUID como
id:use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::create('clientes', function (Blueprint $table) { $table->uuid('id')->primary(); // UUID como PK $table->string('nombre'); $table->string('email')->unique(); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('clientes'); } };
En este caso, el modelo no usará
increments, sino que asignaremos el UUID al crear el registro.2. UUID como identificador alterno
En algunos proyectos prefieres seguir con
id autoincremental (por simplicidad o rendimiento), pero quieres un campo público más seguro para mostrar en URLs o exponer en APIs.Ejemplo de migración con ambos:
Schema::create('clientes', function (Blueprint $table) { $table->id(); // PK autoincremental $table->uuid('uuid')->unique(); // UUID alterno $table->string('nombre'); $table->string('email')->unique(); $table->timestamps(); });
Aquí, tu aplicación seguirá usando
id internamente, pero podrás exponer uuid en URLs:/api/clientes/550e8400-e29b-41d4-a716-446655440000
3. Trait para automatizar la asignación de UUID
Para no repetir código en cada modelo, podemos crear un trait que asigne el UUID automáticamente.
📂
app/Traits/HasUuid.php<?php namespace App\Traits; use Illuminate\Support\Str; trait HasUuid { // Caso 1: UUID como llave primaria protected static function bootHasUuid() { static::creating(function ($model) { if (!$model->getKey()) { $model->{$model->getKeyName()} = (string) Str::uuid(); } }); } public function getIncrementing() { return false; } public function getKeyType() { return 'string'; } }
Uso en modelos
UUID como Primary Key
use App\Traits\HasUuid; class Cliente extends Model { use HasUuid; protected $keyType = 'string'; public $incrementing = false; }
UUID como campo alterno
use App\Traits\HasUuid; class Cliente extends Model { use HasUuid; protected static function boot() { parent::boot(); static::creating(function ($model) { if (empty($model->uuid)) { $model->uuid = (string) \Illuminate\Support\Str::uuid(); } }); } }
Conclusión
Usa UUID como Primary Key si tu sistema es distribuido, requiere mayor seguridad o no quieres depender de IDs secuenciales.
Usa UUID como identificador alterno si prefieres mantener
autoincremental para consultas internas, pero deseas exponer un identificador seguro públicamente.idCon un trait en Laravel, puedes estandarizar la generación de UUIDs y reutilizarlo en cualquier modelo.
En resumen: UUID aporta seguridad, escalabilidad y flexibilidad, y en Laravel es muy fácil incorporarlo.