webpatser/laravel-uuid
Laravel package for generating and working with UUIDs. Provides a UUID model trait, helpers to create v1/v4 UUIDs, and integrates with Eloquent so models can use UUID primary keys instead of auto-increment IDs.
Installation:
composer require webpatser/laravel-uuid
(No service provider or package discovery needed—auto-discovery handles registration.)
First Use Case: Generate a UUID in a controller or command:
use Webpatser\Uuid\Uuid;
$uuid = Uuid::generate(); // Defaults to version 4 (random)
// OR use Str macros:
use Illuminate\Support\Str;
$uuid = Str::fastUuid(); // 15% faster than Str::uuid()
Database Column Setup:
For Eloquent models, use the HasUuids trait:
use Webpatser\Uuid\HasUuids;
class User extends Model
{
use HasUuids;
// Automatically casts 'id' to UUID string
}
Migrations:
Use BinaryUuidMigrations for optimized column types:
use Webpatser\Uuid\BinaryUuidMigrations;
Schema::create('users', function (Blueprint $table) {
BinaryUuidMigrations::uuid($table); // Auto-detects database for binary/string
$table->string('name');
$table->timestamps();
});
Str::fastUuid(); // Version 4 (random), 15% faster
Str::timeBasedUuid(); // Version 1 (time-based)
Str::nameUuidSha1('name');// Version 3 (name-based)
Uuid::generate(); // Defaults to version 4
Uuid::generate(1); // Explicit version
use HasUuids;
class Post extends Model
{
use HasUuids;
protected $keyType = 'string';
}
use HasBinaryUuids;
class Post extends Model
{
use HasBinaryUuids;
// Automatically casts to/from binary
}
Schema::create('posts', function (Blueprint $table) {
BinaryUuidMigrations::uuid($table); // Auto-selects:
// - `binary(16)` for MySQL/PostgreSQL
// - `char(36)` for SQLite/SQL Server
$table->string('title');
});
$sqlServerGuid = Str::uuidToSqlServer($uuid);
$standardUuid = Str::sqlServerBinaryToUuid($sqlServerGuid);
BinaryUuidMigrations::sqlServerUuid($table); // Uses `uniqueidentifier`
use Illuminate\Validation\Rules\Uuid;
public function rules()
{
return [
'user_id' => ['required', new Uuid],
];
}
Route::get('/posts/{post}', function (Post $post) {
// $post->id is automatically resolved as UUID
});
Binary UUIDs require casting to strings for JSON:
// In AppServiceProvider boot():
Model::macro('toArray', function () {
$array = parent::toArray();
if (isset($array['id']) && is_string($array['id']) && strlen($array['id']) === 32) {
$array['id'] = Str::uuidToString($array['id']); // Cast binary to string
}
return $array;
});
// Binary UUID FK (MySQL/PostgreSQL)
$table->binaryUuid('user_id')->constrained();
// String UUID FK (SQLite/SQL Server)
$table->uuid('user_id')->constrained();
public function run()
{
User::factory()->count(10)->create([
'id' => Str::fastUuid(), // Explicit UUID for seed data
]);
}
Use Uuid::generate() for deterministic test IDs:
$uuid = Uuid::generate(1); // Version 1 (time-based, predictable)
User::factory()->create(['id' => $uuid]);
Binary UUID Serialization:
binary in JSON APIs, breaking clients expecting strings.BinaryUuidCast or manually cast in toArray():
$model->id = Str::uuidToString($model->id); // Before JSON encode
SQLite Limitations:
HasUuids trait instead of HasBinaryUuids for SQLite.SQL Server Byte Order:
uniqueidentifier uses mixed-endianness, causing mismatches with standard UUIDs.Str::uuidToSqlServer() when inserting into SQL Server and Str::sqlServerBinaryToUuid() when reading.Route Model Binding:
Route::get('/posts/{post}', function (Post $post) {
// Works if $post->id is string or binary (auto-cast)
});
UUID Version Confusion:
Str::uuid() (Laravel default) generates version 4, while Str::timeBasedUuid() generates version 1. Mixing versions can cause issues in distributed systems.Migration Downgrades:
Str::uuidToString() in a data migration:
DB::table('users')->update(['id' => Str::uuidToString('id')]);
Validate UUIDs:
if (!Str::fastIsUuid($value)) {
throw new \InvalidArgumentException('Invalid UUID');
}
Inspect Binary UUIDs:
$binaryUuid = Str::uuidToBinary($uuid);
dd(bin2hex($binaryUuid)); // Hex representation for debugging
SQL Server GUID Issues:
$standard = Str::uuidToBinary($uuid);
$sqlServer = Str::uuidToSqlServerBinary($uuid);
dd(hexdec(bin2hex($standard)) === hexdec(bin2hex($sqlServer))); // Should be false
Performance Bottlenecks:
fastUuid() vs. uuid():
$time = microtime(true);
for ($i = 0; $i < 10000; $i++) {
Str::fastUuid();
}
echo microtime(true) - $time; // Compare with Str::uuid()
Custom UUID Versions:
Extend webpatser/uuid to support UUIDv7/v8:
// In a service provider:
Str::macro('customUuid', function () {
return Uuid::generate(8); // UUIDv8
});
Database-Specific Casts:
Override BinaryUuidCast for custom storage:
class CustomBinaryUuidCast implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes)
{
return Str::uuidToBinary($value);
}
public function set($model, string $key, $value, array $attributes)
{
return Str::uuidToString($value);
}
}
Migration Helpers: Add support for new databases:
BinaryUuidMigrations::extend(function (Blueprint $table, string $column) {
// Custom logic for Oracle, etc.
});
Validation Rules:
Extend the Uuid rule for custom formats:
use Illuminate\Validation\Rules\Uuid as BaseUuid
How can I help you explore Laravel packages today?