1. Go to this page and download the library: Download kenzal/mysql-binary-uuids library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
kenzal / mysql-binary-uuids example snippets
> use Ramsey\Uuid\Uuid;
>
> // ✅ Query with objects
> User::find($uuidObject);
> User::find(Uuid::fromString($uuidString));
> User::where('id', $uuidObject)->first();
>
> // ❌ Returns null — raw strings won't match binary(16)
> User::find($uuidString);
> User::where('id', $uuidString)->first();
>
Schema::create('users', function (Blueprint $table) {
$table->uuid('id')->primary(); // Stored as binary(16)
$table->uuid('organization_id');
$table->timestamps();
});
use Kenzal\MysqlBinaryUuids\Casts\BinaryUuid;
use Kenzal\MysqlBinaryUuids\Casts\BinaryUlid;
class User extends Model
{
protected function casts(): array
{
return [
'id' => BinaryUuid::class,
'session_id' => BinaryUlid::class,
];
}
}
use Kenzal\MysqlBinaryUuids\Concerns\HasBinaryUuids;
class User extends Model
{
use HasBinaryUuids;
// That's it! Automatic UUID v7 generation with binary storage
}
Schema::create('sessions', function (Blueprint $table) {
$table->binaryUlid('id')->primary();
$table->binaryUlid('user_id');
$table->foreignBinaryUlid('parent_id')->nullable();
});
use Illuminate\Database\Eloquent\Model;
use Kenzal\MysqlBinaryUuids\Casts\BinaryUuid;
class Post extends Model
{
protected function casts(): array
{
return [
'id' => BinaryUuid::class,
'author_id' => BinaryUuid::class,
];
}
}
// Create a post (provide an ID since no trait for auto-generation)
$post = Post::create([
'id' => '019eb8b2-8b13-7232-a60c-f19b6f0827df',
'title' => 'My Post',
'author_id' => '550e8400-e29b-41d4-a716-446655440000',
]);
// Access as UUID objects
echo $post->id->toString(); // "019eb8b2-8b13-7232-a60c-f19b6f0827df"
echo $post->author_id->toString(); // "550e8400-e29b-41d4-a716-446655440000"
// Works with UUID objects too
use Ramsey\Uuid\Uuid;
$post->author_id = Uuid::uuid4();
$post->save();
use Illuminate\Database\Eloquent\Model;
use Kenzal\MysqlBinaryUuids\Concerns\HasBinaryUuids;
class User extends Model
{
use HasBinaryUuids;
protected $fillable = ['name', 'email'];
}
// UUID v7 is automatically generated
$user = User::create([
'name' => 'John Doe',
'email' => '[email protected]',
]);
echo $user->id->toString(); // Auto-generated UUID v7
use Kenzal\MysqlBinaryUuids\Concerns\HasBinaryUlids;
class Session extends Model
{
use HasBinaryUlids;
protected $fillable = ['user_id'];
}
$session = Session::create([
'user_id' => $user->id,
]);
// ULID objects are chronologically sortable
echo $session->id; // "01ARZ3NDEKTSV4RRFFQ69G5FAV"
use Kenzal\MysqlBinaryUuids\Concerns\HasBinaryUuids;
class Document extends Model
{
use HasBinaryUuids;
public function uuidColumns(): array
{
return ['id', 'document_number', 'revision_id'];
}
}
// All three columns get binary UUID casts and auto-generation
use Kenzal\MysqlBinaryUuids\ExtensibleUuid;
class DocumentUuid extends ExtensibleUuid
{
// ...
}
use Kenzal\MysqlBinaryUuids\Concerns\HasBinaryUuids;
class Document extends Model
{
use HasBinaryUuids;
public function uuidColumns(): array
{
return [
'id', // Uses default BinaryUuid cast
'document_uuid' => DocumentUuid::class, // Custom UUID subclass
];
}
}
use Kenzal\MysqlBinaryUuids\Casts\BinaryUuid;
use Kenzal\MysqlBinaryUuids\ExtensibleUuid;
class CustomUuid extends ExtensibleUuid {}
class Document extends Model
{
protected function casts(): array
{
return [
'id' => BinaryUuid::class,
'document_uuid' => CustomUuid::class,
];
}
}
use Kenzal\MysqlBinaryUuids\Concerns\HasBinaryUuids;
use Kenzal\MysqlBinaryUuids\Casts\BinaryUlid;
class MixedModel extends Model
{
use HasBinaryUuids; // For UUID primary key
public function uuidColumns(): array
{
return ['id']; // UUID auto-generated
}
protected function casts(): array
{
return [
'session_id' => BinaryUlid::class, // ULID manually specified
];
}
}
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('organizations', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('name');
$table->timestamps();
});
Schema::create('users', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->uuid('organization_id');
$table->string('name');
$table->string('email')->unique();
$table->timestamps();
$table->foreign('organization_id')
->references('id')
->on('organizations')
->onDelete('cascade');
});
}
};
Schema::create('posts', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->uuid('parent_id')->nullable(); // Optional parent post
$table->uuid('author_id');
$table->string('title');
$table->text('content');
$table->timestamps();
});
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
public function up(): void
{
// First, create a temporary column
DB::statement('ALTER TABLE users ADD COLUMN id_binary BINARY(16) AFTER id');
// Convert existing UUIDs to binary
DB::statement('UPDATE users SET id_binary = UNHEX(REPLACE(id, "-", ""))');
// Drop old column and rename new one
DB::statement('ALTER TABLE users DROP PRIMARY KEY, DROP COLUMN id');
DB::statement('ALTER TABLE users CHANGE id_binary id BINARY(16)');
DB::statement('ALTER TABLE users ADD PRIMARY KEY (id)');
}
public function down(): void
{
// Convert back to char(36) if needed
DB::statement('ALTER TABLE users ADD COLUMN id_char CHAR(36) AFTER id');
DB::statement('UPDATE users SET id_char = LOWER(CONCAT(
HEX(SUBSTRING(id, 1, 4)), "-",
HEX(SUBSTRING(id, 5, 2)), "-",
HEX(SUBSTRING(id, 7, 2)), "-",
HEX(SUBSTRING(id, 9, 2)), "-",
HEX(SUBSTRING(id, 11, 6))
))');
DB::statement('ALTER TABLE users DROP PRIMARY KEY, DROP COLUMN id');
DB::statement('ALTER TABLE users CHANGE id_char id CHAR(36)');
DB::statement('ALTER TABLE users ADD PRIMARY KEY (id)');
}
};
use Illuminate\Database\Eloquent\Model;
use Kenzal\MysqlBinaryUuids\Concerns\HasBinaryUuids;
class User extends Model
{
use HasBinaryUuids;
}
// GET /users/550e8400-e29b-41d4-a716-446655440000
Route::get('/users/{user}', function (User $user) {
return $user; // Resolved correctly from binary(16) column
});
use App\Models\Post;
use Illuminate\Support\Facades\Route;
use Ramsey\Uuid\Uuid;
Route::bind('post', function (string $value) {
return Post::where('id', Uuid::fromString($value))->firstOrFail();
});
class Document extends Model
{
use HasBinaryUuids;
public function uuidColumns(): array
{
return ['id', 'document_uuid'];
}
public function getRouteKeyName(): string
{
return 'document_uuid';
}
}
// GET /documents/550e8400-e29b-41d4-a716-446655440000
Route::get('/documents/{document}', function (Document $document) {
return $document;
});
use Ramsey\Uuid\Uuid;
// Pass objects, not raw strings
$user = User::where('id', Uuid::fromString($uuidString))->first();
$user = User::find($uuidObject);
// Raw strings won't match binary(16) columns
User::find($uuidString); // null — use the object instead