Все когда-то доходят до того момента, когда автоинкрементные ID начинают раздражать. Особенно, когда у тебя распределённая система, куча сервисов или база, где дырки в ID палятся моментально.

Вот тут на сцену выходит UUID — строка-уродец длиной в 36 символов, которая гарантирует, что два твоих объекта не пересекутся. Даже если они родились на разных серверах и не знают друг о друге.

Но за всё надо платить. UUID — это жирный ключ, который тормозит индексы, увеличивает размер базы и делает твои джойны похожими на больное месиво. Поэтому включать UUID просто потому что "так модно" — это как ставить спойлер на «Приору». Вроде красиво, но толку — ноль.

Вариант 1. Сторонний пакет

ramsey/uuid — дед в мире UUID, проверенный временем.

composer require ramsey/uuid

Дальше в модели:

use Illuminate\Database\Eloquent\Model;
use Ramsey\Uuid\Uuid;

class Post extends Model
{
    public $incrementing = false;
    protected $keyType = 'string';

    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            $model->{$model->getKeyName()} = (string) Uuid::uuid4();
        });
    }
}

Теперь у тебя ключи не автоинкрементные циферки, а строковые монстры.

Вариант 2. Стандартный от Laravel

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Post extends Model
{
    public $incrementing = false;
    protected $keyType = 'string';

    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            $model->{$model->getKeyName()} = (string) Str::uuid();
        });
    }
}

Никаких пакетов, всё на борту. Разница минимальная.

Миграции под UUID

Миграция проста как лом:

Schema::create('posts', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->string('title');
    $table->text('body');
    $table->timestamps();
});

И всё, у тебя таблица с UUID.

Где реальный профит

— Микросервисы. Когда таблицы рождаются в разных базах и потом стыкуются — автоинкрементный id превращается в минное поле. UUID тут реально спасает.

— Безопасность. Никто не будет угадывать "пользователь №17" или "заказ №1337". Для API это уже не баг, а фича.

— Репликация. Когда у тебя база в нескольких датацентрах и они все пишут данные. Тут без UUID ты просто упрёшься в конфликты.

Где боль

— Размер. UUID в 4 раза жирнее INT. Индексы пухнут, джойны дохнут.

— Читаемость. id = 42 я запомню. id = 550e8400-e29b-41d4-a716-446655440000 — ну попробуй продебажить с этим счастьем.

— Производительность. Чем больше у тебя данных, тем быстрее ты начнёшь жалеть, что не остановился на автоинкременте.

Финалочка

UUID — это инструмент, а не украшение. В Laravel его воткнуть легко, но нужно задать себе честный вопрос: ты реально работаешь с распределёнными системами или просто решил "поиграться с модным словом"? Если второе — оставь себе обычный id. Если первое — UUID тебе жизнь упростит, но за это придётся платить скоростью и нервами.