Cómo usar UUIDs como Llave Primaria en Laravel

Aunque Laravel usa como llave primaria o primary key en los modelos un ID con un valor auto-incrementable, podemos cambiar esa funcionalidad por defecto a una personalizada usando UUIDs con llave primaria.

Para ello, deberás crear un trait y usarlo en todos tus modelos o al menos en los modelos que necesiten está funcionalidad así como las migraciones de dichos modelos.

Trait de UUID

Para crear este trait de UUID de php solo necesitarás copiar el siguiente código dentro del archivo con ruta app/Traits/HasUUID.php, y/o, adicionalmente, deberás crear la carpeta Traits si no lo has hecho y el archivo HasUUID.php

<?php namespace App\Traits; use Illuminate\Support\Str; trait HasUUID { public function getIncrementing () { return false; } public function getKeyType () { return 'string'; } public function getKeyName () { return 'uuid'; } protected static function boot() { parent::boot(); static::creating(function ($model) { if ($model->getKey() === null) { $model->setAttribute($model->getKeyName(), Str::uuid()->toString()); } }); } }
Trait de UUID de PHP para Modelos de Laravel

Como te habrás dado cuenta, el trait que hemos creado reemplaza algunos valores de la llave primaria por defecto de los modelos de laravel y, adicionalmente, crea un observable (creating) para asignar el UUID al modelo antes de insertarlo en la base de datos.

Modelos con UUID

Una vez hemos creado nuestro trait, debemos usarlo en los modelos que requieren esta funcionalidad de la siguiente manera.

<?php namespace App\Models; use App\Traits\HasUUID; ... class User extends Authenticatable { use HasUUID, HasFactory, Notifiable; ... }
Modelo User con UUID

Migraciones con UUID

De igual manera, debemos modificar la migración de dicho modelo para que la columna primaria sea un uuid.

<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration { public function up() { Schema::create('users', function (Blueprint $table) { $table->uuid('uuid')->primary(); }); } ... }
Migración de la Tabla Users con UUID

Sugerencias

Asegúrate de haber cambiado el nombre de tu llave primaria en todos los lugares donde la uses (factories, controllers, etc) o por el contrario mantener el nombre de la llave como "id" y no como "uuid".