https://github.com/verbanent/eloquent-binary-uuid
Ordered binary UUID in Laravel / Eloquent based on UUID version 1
https://github.com/verbanent/eloquent-binary-uuid
binary eloquent foreign hex index key laravel ordered primary uuid
Last synced: 9 days ago
JSON representation
Ordered binary UUID in Laravel / Eloquent based on UUID version 1
- Host: GitHub
- URL: https://github.com/verbanent/eloquent-binary-uuid
- Owner: verbanent
- License: mit
- Created: 2020-08-07T12:42:01.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2023-02-14T20:18:16.000Z (almost 3 years ago)
- Last Synced: 2026-01-11T15:20:24.021Z (15 days ago)
- Topics: binary, eloquent, foreign, hex, index, key, laravel, ordered, primary, uuid
- Language: PHP
- Homepage:
- Size: 112 KB
- Stars: 3
- Watchers: 1
- Forks: 3
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Ordered binary UUID in Laravel / Eloquent
[](https://sonarcloud.io/dashboard?id=verbanent_eloquent-binary-uuid)
[](https://packagist.org/packages/verbanent/eloquent-binary-uuid)
[](https://github.styleci.io/repos/285826449?branch=main)
[](https://www.codefactor.io/repository/github/verbanent/eloquent-binary-uuid/overview/main)
[](https://sonarcloud.io/dashboard?id=verbanent_eloquent-binary-uuid)
[](https://sonarcloud.io/dashboard?id=verbanent_eloquent-binary-uuid)
[](https://sonarcloud.io/dashboard?id=verbanent_eloquent-binary-uuid)



Based on articles about the optimization of UUID storage in databases, I decided to write a simple library that allows this in my projects. I based on the information available here:
https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/
https://percona.community/blog/2018/10/12/generating-identifiers-auto_increment-sequence/
The package currently only supports MySQL.
## Installation
Please install the package via Composer:
```bash
composer require verbanent/eloquent-binary-uuid
```
## Basic example
This example keeps things simple: `Foo` and `Bar` both use UUID primary keys,
and `Bar.foo_id` references `Foo.id`.
### Migrations
```php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::create('foos', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('name')->nullable();
$table->timestamps();
});
Schema::create('bars', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->uuid('foo_id');
$table->string('title')->nullable();
$table->timestamps();
$table->foreign('foo_id')->references('id')->on('foos')->cascadeOnDelete();
});
```
### Models
```php
namespace App\Models;
use Verbanent\Uuid\AbstractModel;
class Foo extends AbstractModel
{
protected $fillable = ['name'];
public function bars()
{
return $this->hasMany(Bar::class, 'foo_id');
}
}
```
```php
namespace App\Models;
use Verbanent\Uuid\AbstractModel;
use Verbanent\Uuid\Traits\ForeignBinaryUuidSupportableTrait;
class Bar extends AbstractModel
{
protected $fillable = ['title'];
public function foo()
{
return $this->belongsTo(Foo::class, 'foo_id');
}
}
```
### Usage
```php
$foo = \App\Models\Foo::create(['name' => 'Alpha']);
$bar = new \App\Models\Bar(['title' => 'Child']);
$bar->foo()->associate($foo);
$bar->save();
```
## Examples
More scenarios are documented in the `examples/` directory:
- `examples/01-single-model-uuid-primary-key.md`
- `examples/02-two-models-uuid-pk-and-fk.md`
- `examples/03-creating-entities-with-binary-uuid.md`
- `examples/04-creating-entities-with-string-uuid.md`
- `examples/05-querying.md`
## Configuration
If you want a global default UUID column name, publish the config and set the
environment variable.
1. Publish the config file:
```bash
php artisan vendor:publish --provider="Verbanent\\Uuid\\Providers\\BinaryUuidServiceProvider" --tag=binary-uuid-config
```
2. Set the default column name in `.env`:
```
BINARY_UUID_DEFAULT_COLUMN=uuid
```
3. Refresh config:
```bash
php artisan config:clear
# or
php artisan config:cache
```
Per-model override still works and takes precedence:
```php
protected $uuidColumn = 'custom_uuid';
```
## Unit tests
Run this command if you want to check unit tests:
```shell
./vendor/bin/phpunit
```
Or if you want to check code coverage:
```shell
phpdbg -qrr vendor/bin/phpunit --coverage-html coverage tests
```