Cómo usar UUID en lugar de ID de incremento automático en su aplicación Laravel
Los UUID (Identificador único universal) son valores de 128 bits que se utilizan para identificar de forma única los registros de la tabla. Por lo general, se representan como una cadena hexadecimal dividida en cinco grupos separados por guiones. Un ejemplo típico se ve así:
116c34de-3dcb-44bc-9511-a48242b9aaab
El objetivo de este artículo no es abordar las ventajas o desventajas de usar UUID, sino ver cómo implementarlos en una aplicación Laravel y actualizar cualquier clave externa basada en una columna UUID. Para el propósito de este artículo, usaremos Laravel 7.x, pero esto puede funcionar en cualquier otra versión de Laravel (probado en 5.8 y 6.x). Puede obtener el código fuente de este tutorial aquí.
Comencemos por crear una nueva aplicación de Laravel llamada laravel-uuid-demo.
composer create-project --prefer-dist laravel/laravel laravel-uuid-demo
Esto creará una nueva aplicación con la última versión de Laravel. Si desea especificar una versión de Laravel, agregue el número de versión al final como:
composer create-project --prefer-dist laravel/laravel your-project-name "7.0.*"
Vamos a utilizar la biblioteca UUID de Ramsey, que es un paquete que ayuda a generar identificadores únicos universales.
NB: Desde Laravel 5.6, el UUID de Ramsey es parte de Laravel. No es necesario instalarlo a través de Composer.
Si está utilizando una versión de Laravel por debajo de 5.6, ejecute lo siguiente:
composer require ramsey/uuid
Empecemos a codificar
(Opcional) Ahora movamos el modelo de Usuario dentro de una carpeta de Modelos y modifiquemos el espacio de nombres dentro de User.php de Aplicación a Aplicación \ Modelos como se muestra a continuación.
namespace App\Models;
Creemos un rasgo para el UUID para que se pueda reutilizar fácilmente en toda nuestra aplicación (gracias a Wilbur Powery por este consejo). Lo importaremos en cualquier modelo de Eloquent que requiera una clave primaria UUID. Cree una nueva carpeta Traits y cree un nuevo archivo Uuids.php
Para cualquier versión de Laravel desde 5.6 y superior, agregue el siguiente código dentro del rasgo Uuids.php:
<?phpnamespace App\Traits;use Illuminate\Support\Str;trait Uuids { /** * Boot function from Laravel. */ protected static function boot() { parent::boot(); static::creating(function ($model) { if (empty($model->{$model->getKeyName()})) { $model->{$model->getKeyName()} = Str::uuid()->toString(); } }); } /** * Get the value indicating whether the IDs are incrementing. * * @return bool */ public function getIncrementing() { return false; } /** * Get the auto-incrementing key type. * * @return string */ public function getKeyType() { return 'string'; } }
NB: Para cualquier versión de Laravel por debajo de 5.6, use el siguiente rasgo en su lugar:
<?phpnamespace App\Traits;use Ramsey\Uuid\Uuid;trait Uuids { /** * Boot function from Laravel. */ protected static function boot() { parent::boot();static::creating(function ($model) { if (empty($model->{$model->getKeyName()})) { $model->{$model->getKeyName()} = Uuid::uuid4()->toString(); } }); } /** * Get the value indicating whether the IDs are incrementing. * * @return bool */ public function getIncrementing() { return false; } /** * Get the auto-incrementing key type. * * @return string */ public function getKeyType() { return 'string'; } }
Vamos a descomprimirlo: por convención, Eloquent asume que la clave principal en un modelo es un valor entero creciente. Como usamos UUID, debemos especificar que la clave principal es una cadena y que no es un valor creciente. Lo hacemos configurando $keyType
en string y $incrementing
en false. Luego anulamos la función de arranque del modelo para usar UUID.
Ahora, importemos el rasgo a nuestro modelo de usuario. Sus declaraciones de importación y de uso deben verse así:
A continuación, transformemos la migración de nuestros usuarios para usar UUID en lugar de incrementos automáticos. Dentro de sus migraciones CreateUsersTable,
Remplazar:
$table->id();
Con:
$table->uuid('id')->primary();
Ahora, ejecutemos la migración: actualice su archivo .env configurando el nombre de la base de datos, el nombre de usuario y la contraseña. Y cree la base de datos en su entorno favorito. Entonces corre:
php artisan migrate
Pruebas
Ahora estamos listos para probar. Creemos algunos usuarios falsos usando factory y sembradoras. De forma predeterminada, Laravel viene con una UserFactory dentro de la base de datos / fábricas. Si ha colocado su modelo de usuario dentro de una carpeta Modelos, actualice la declaración de importación dentro de su clase UserFactory desde
use App\User;
A:
use App\Models\User;
Entonces, creemos una sembradora.
php artisan make:seeder UserSeeder
En la nueva clase generada, importe el modelo de usuario y dentro de la función run (), agregue:
factory(User::class, 6)->create();
Su clase UserSeeder debería verse así:
Abra la clase DatabaseSeeder dentro de la carpeta de semillas y descomente / modifique la línea que llama a la clase UserSeeder. Su clase DatabaseSeeder debería verse así:
Ahora ejecutemos la sembradora. En su terminal, escriba:
php artisan db:seed
Eso es. Ahora, revisemos la tabla de Usuarios para ver los datos generados.
Puede ver que la columna de identificación usa UUID, y no la identificación incrementada.
Consejo adicional:
Si está utilizando una clave primaria UUID como clave externa en otra tabla, debe cambiar el tipo de columna a uuid, donde se define la clave externa. Por ejemplo: supongamos que cada usuario tiene un perfil. Su columna user_id en la tabla de perfiles deberá cambiar de
$table->bigInteger('user_id')->unsigned();
To
$table->uuid('user_id');
La migración del perfil se verá así:
Si está creando una API y utilizando Laravel Passport o un paquete de roles y permisos como el permiso Laravel Spatie, deberá publicar las migraciones y actualizar el tipo de columna user_id a uuid.