'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]

  1. add column in table name 'Uuid', type 'char' length 36

  2. create folder name 'Traits' inside Models folder

  3. 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();
        });
    }
}

  1. 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.

https://github.com/EmadAdly/laravel-uuid

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