在 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
,我们监听了creating
Eloquent 事件。该事件在记录实际存储到数据库之前触发。我们钩住这个事件,并使用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