'Laravel UUID generation
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.
Solution 1:[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:[2]
In Laravel 5.6+
use Illuminate\Support\Str;
$uuid = Str::uuid()->toString();
Solution 3:[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:[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:[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
Solution 6:[6]
Try to use this package will automatically generate and assign UUID field in your model, also can show and update by UUIDs key.
Solution 7:[7]
for laravel < 5.6
use DB::raw('uuid()');
please have a look at below example
inside model
use Illuminate\Support\Facades\DB;
public static function boot(){
parent::boot();
$creationCallback = function ($model) {
if (empty($model->{$model->getKeyName()}))
$model->{$model->getKeyName()} = DB::raw('uuid()');
};
static::creating($creationCallback);
}
Pros
--You don't have to use any third-party plugin to get UUID in case you are using laravel < 5.6
Cons
after saving the data using ORM you need to query again to get the last inserted id otherwise you will get uuid().
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Toby Allen |
Solution 2 | Andrew Koper |
Solution 3 | Skatch |
Solution 4 | bishop |
Solution 5 | |
Solution 6 | Emad Adly |
Solution 7 |