Laravel UUID generation
Solution 1
After laravel 5.6 a new helper was added to generate Universal Unique Identifiers (UUID)
use Illuminate\Support\Str;
return (string) Str::uuid();
return (string) Str::orderedUuid();
The methods return a Ramsey\Uuid\Uuid
object
The orderedUuid()
method will generate a timestamp first UUID for easier and more efficient database indexing.
Solution 2
In Laravel 5.6+
use Illuminate\Support\Str;
$uuid = Str::uuid()->toString();
Solution 3
Turns out I had to use $uuid->string
to get the actual ID, the whole object shows empty if you try to return it in a json response.
Solution 4
It's possible that $uuid
is empty because your system doesn't provide the right kind of entropy. You might try these library implementations for either a v4 or v5 UUID:
// https://tools.ietf.org/html/rfc4122#section-4.4
function v4() {
$data = openssl_random_pseudo_bytes(16, $secure);
if (false === $data) { return false; }
$data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
$data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
// https://tools.ietf.org/html/rfc4122#section-4.3
function v5($name) {
$hash = sha1($name, false);
return sprintf(
'%s-%s-5%s-%s-%s',
substr($hash, 0, 8),
substr($hash, 8, 4),
substr($hash, 17, 3),
substr($hash, 24, 4),
substr($hash, 32, 12)
);
}
Solution 5
add column in table name 'Uuid', type 'char' length 36
create folder name 'Traits' inside Models folder
Create file name Uuid.php inside Traits folder
Uuid.php
<?php
namespace App\Models\Traits;
use Ramsey\Uuid\Uuid as PackageUuid;
trait Uuid
{
public function scopeUuid($query, $uuid)
{
return $query->where($this->getUuidName(), $uuid);
}
public function getUuidName()
{
return property_exists($this, 'uuidName') ? $this->uuidName : 'uuid';
}
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getUuidName()} = PackageUuid::uuid4()->toString();
});
}
}
- add 'use Uuid' inside your model
Skatch
PHP developer skilled for both frontend and backend development. Most qualified for CakePHP, jQuery, HTML5 with CSS3 and MySQL.
Updated on July 08, 2022Comments
-
Skatch almost 2 years
I am trying to generate a UUID (not as primary key, just generate one) with the laravel-uuid package. The docs are pretty straightforward, so according to the readme file a UUID should be generated just by calling
$uuid = Uuid::generate();
, but it returns an empty object. (I also tried$uuid = Uuid::generate(1);
)I followed the installation instructions as provided there (nothing out of the ordinary), the app doesn't throw any errors, so I guess everything is right.
Alternative packages for this are also welcome.
-
Skatch almost 8 yearsthanks mate, I'll try this as a last resort, I wanted to use something built for laravel
-
Abdul Rehman almost 4 yearsValid for laravel 7 as well. Thanks
-
shyammakwana.me over 2 yearsWorks for Laravel 8 too.
-
Kalema Edgar almost 2 yearsYou can add the uuid field as part of the casts section within the model For my case, the id was the uuid field and to return the actual uuid as part of the response, I had to cast it as below.
protected $casts = ['id' => 'string'];
-
Amir Hassan Azimi almost 2 yearsYou don't need toString()