fahriztx/model-uuid
Laravel/PHP trait to add automatic UUIDs to Eloquent models. Generates a UUID when creating records and supports using UUIDs as primary keys or additional identifiers, reducing reliance on auto-increment IDs and easing integration across systems.
Installation
composer require fahriztx/model-uuid
Publish the migration if needed (check vendor/fahriztx/model-uuid/migrations/).
Configure UUID as Primary Key
Modify your model’s $keyType and $incrementing properties:
use FAHRIZTX\ModelUuid\HasUuid;
class User extends Model
{
use HasUuid;
protected $keyType = 'string';
protected $incrementing = false;
}
Run Migrations
php artisan migrate
The package ensures UUID columns are created with the correct type (e.g., uuid in PostgreSQL, char(36) in MySQL).
First Use Case Create a record and observe UUID generation:
$user = User::create(['name' => 'John Doe']);
dd($user->id); // e.g., "550e8400-e29b-41d4-a716-446655440000"
UUID Generation
Ramsey\Uuid (included).$user = User::forceFill(['id' => 'custom-uuid'])->save();
Querying by UUID
find() or where():
$user = User::find('550e8400-e29b-41d4-a716-446655440000');
User::where('id', '550e8400-e29b-41d4-a716-446655440000')->first();
Relationships
class Post extends Model
{
use HasUuid;
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
}
Seeding
Str::uuid() in seeders or factories:
User::factory()->create(['id' => Str::uuid()]);
API Responses
Database-Specific Setup:
uuid-ossp extension. Add to config/database.php:
'postgres' => [
'extensions' => ['uuid-ossp'],
],
char(36) with binary storage for efficiency.Casting:
string in API resources if needed:
public function toArray($request)
{
return [
'id' => $this->id->toString(),
];
}
Testing:
$this->partialMock(User::class, 'generateUuid')
->shouldReceive('generateUuid')
->andReturn('test-uuid');
Migration Conflicts
Foreign Key Mismatches
$keyType = 'string' on related models causes ForeignKeyDoesNotMatch errors. Solution: Ensure all related models use HasUuid.UUID Length in MySQL
char(36) may cause index bloat. Solution: Use binary(16) for storage (requires custom casting):
protected $casts = [
'id' => 'string',
];
UUID Collisions
use Ramsey\Uuid\Uuid;
public function validateUuid($uuid)
{
return Uuid::isValid($uuid);
}
UUID Not Generated?
Check if $incrementing = false and $keyType = 'string' are set. Verify the id column type in the database matches expectations.
Slow Queries?
UUIDs in indexes may perform worse than integers. Solution: Use database-specific optimizations (e.g., PostgreSQL’s uuid-ossp functions for generation).
Custom UUID Generation
Override the generateUuid() method in your model:
protected function generateUuid()
{
return Uuid::uuid4()->toString();
}
UUID Validation Add custom validation rules:
use Illuminate\Validation\Rule;
$request->validate([
'id' => ['required', Rule::uuid()],
]);
UUID Formatting Use accessors to format UUIDs (e.g., hyphenated):
public function getIdAttribute($value)
{
return Uuid::fromString($value)->toString();
}
Database-Specific UUID Handling
Extend the package’s UuidServiceProvider to add custom logic for your database:
public function boot()
{
if (config('database.default') === 'pgsql') {
// Custom PostgreSQL logic
}
}
How can I help you explore Laravel packages today?