UUID als ID unter Eloquent ORM nutzen

Statt einer einfachen, hochzählenden Zahl als ID, kann auch ein sogenannter „Universally Unique Identifier“ (kurz UUID) verwendet werden. Dieser ist eine Zeichenkette aus 36 Zeichen und hat ein paar Vorteile:

  • Die ID kann nicht erraten werden, da sie nicht nur hochgezählt wird
  • Eine UUID ist eindeutig und basiert auf den Timestamp der Generierung. Das heißt, dass die Datensätze auch über mehrere Datenquellen abgeglichen werden können, da es so keine Konflikte wie bei einfachen IDs gibt.

Laravel Paket zur Generierung der UUIDs

Damit wird die UUID nach dem RFC 4122 Standard generieren können, müssen wir ein zusätzliches Paket laden: Laravel Uuid

UUID statt ID unter Laravel

In der Migration verwenden wir statt der üblichen increments('id') Methode jetzt eine Spalte vom Typ „String“:

$table->string('id', 36)->primary()->unique();

UUID Model

Im Folgenden wird eine neue Model Klasse erstellt, auf die wir bei unseren einzelnen Models (die UUID verwenden sollen) zurückgreifen können:

<?php
// File: app/models/UuidModel.php
 
use Webpatser\Uuid\Uuid;
 
class UuidModel extends Eloquent
{
    public $incrementing = false;
 
    protected static function boot()
    {
        parent::boot();
 
        static::creating(function ($model)
        {
            $model->{$model->getKeyName()} = (string) $model->generateNewId();
        });
    }
 
    public function generateNewId()
    {
        return Uuid::generate();
    }
}

Unsere Model Datei

In unserem Model schreiben wir dann nur noch:

<?php
// File: app/models/User.php
 
class User extends UuidModel {}

Wenn wir nun über „Eloquent ORM“ einen neuen Datensatz anlegen und speichern, hat dieser eine entsprechende ID/UUID wie: 1e303600-9be4-11e4-b40a-83775f8a121f