在 Laravel 中轻松使用 UUID

2025-06-07

在 Laravel 中轻松使用 UUID

首次发表于我的网站

什么是 UUID?

UUID 是Universal Unique Identifier(通用唯一标识符)的缩写。它是一个 128 位的数字,用于唯一标识某个对象,或者在我们这个例子中,是数据库中的一条记录。

我不会深入探讨 UUID 与常规自增 ID 相比的优缺点,那可以写一篇完整的博文来探讨。我只想向你展示如何在 Laravel 应用程序中轻松使用 UUID(如果你也想)。

准备迁移

在数据库中使用 UUID 的第一步是将列设置为特定类型。默认情况下,Laravel 迁移会包含$table->primary('id');您创建的每个迁移中的一列。

使用 UUID 非常简单,只需更新我们的迁移文件,使用->uuid()Laravel 提供的开箱即用方法即可。例如,假设我们正在创建一个迁移文件来描述一篇帖子的架构。

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

您应该注意到这一行:$table->uuid('id')->primary();。请注意,我们使用的是uuid()方法,而不是通用increments()方法。如您所见,该uuid()方法指定该列应为 UUID 等效列,并且我们还指定它应为表的主键。

创建UUID

如果您运行php artisan migrate,并尝试使用工厂之类的东西创建新记录,或者手动创建它,您将遇到一条错误消息,提示该id列不能为空。

当我们在迁移中使用该primary()方法时,Laravel 会注意到它是一个自增列,并会帮我们处理。但是,由于我们切换到使用 UUID,所以我们需要自己创建 ID。

使用 Eloquent 模型事件

由于您使用 Laravel,我想您也会使用 Eloquent 轻松地与您的数据库交互。

Eloquent 拥有所谓的模型事件。它总共会在不同的场景下触发 11 个事件。以下是一些事件:

  • retrieved
  • creating
  • created
  • updating
  • updated
  • saving
  • saved
  • deleting
  • deleted
  • restoring
  • restored

如果您想了解有关 Eloquent Events 的更多信息,可以在此处找到其文档。

现在,回到创建 UUID 的环节。我们来看看你的Post模型看起来是什么样子的:

class Post extends Model
{
    protected $guarded = []; // YOLO

    protected static function boot()
    {
        parent::boot();

        static::creating(function ($post) {
            $post->{$post->getKeyName()} = (string) Str::uuid();
        });
    }

    public function getIncrementing()
    {
        return false;
    }

    public function getKeyType()
    {
        return 'string';
    }
}

我们的模型包含 3 个方法。该boot方法用于连接模型并监听 Eloquent 事件。EloquentgetIncrementing会使用该方法判断表上的 ID 是否在递增。记住,我们使用的是 UUID,因此我们将自动递增设置为false
最后,该getKeyType方法仅指定表上的 ID 应存储为字符串。

在我们的方法中boot,我们监听了creatingEloquent 事件。该事件在记录实际存储到数据库之前触发。我们钩住这个事件,并使用Laravel 中类uuid()提供的方法。Str

不久前,人们可能安装了带有 Composer 的包来生成 UUID,但您可以使用uuid()该类提供的方法轻松生成它们。

就这么简单,您可以在 Laravel 中使用 UUID。

最后要说的是,我通常会在 PHP trait 中调用一个UsesUuid方法来实现上述逻辑。这样,我就不用在每个需要使用 UUID 的模型上重复写代码了。

UsesUuid特征如下所示:

<?php

namespace App\Models\Concerns;

use Illuminate\Support\Str;

trait UsesUuid
{
    protected static function bootUsesUuid()
    {
        static::creating(function ($model) {
            if (! $model->getKey()) {
                $model->{$model->getKeyName()} = (string) Str::uuid();
            }
        });
    }

    public function getIncrementing()
    {
        return false;
    }

    public function getKeyType()
    {
        return 'string';
    }
}

请注意,一切都变得更加通用,并且不依赖于唯一的模型。

现在,在任何模型中,作为其迁移中的正确列,您可以简单地使用UsesUuid如下特征:

class Post extends Model
{
  use App\Models\Concerns\UsesUuid;

  protected $guarded = []; // YOLO
}

就这样。只需几个简单的步骤,你就可以在 Laravel 应用中使用 UUID 了。

文章来源:https://dev.to/wilburpowery/easily-use-uuids-in-laravel-45be
PREV
如何使用 $.ajax() 用法
NEXT
使用 Gatsby 和 MDX 重新设计我的博客