Laravel 使用 UUID

Laravel 使用 UUID
最新回答
紫萌雨

2020-06-20 00:14:06

在 Laravel 5.6 中集成 UUID 可以通过以下步骤实现,核心流程包括数据表设计、Model 配置及代码复用优化:

1. 数据表设计:指定 UUID 字段

在迁移文件中修改主键字段定义,将默认的自增 id 替换为 UUID 类型:

Schema::create('your_table', function (Blueprint $table) { $table->uuid('id')->primary(); // 使用 uuid() 方法并设置为主键 // 其他字段...});
  • 关键点:必须显式声明 primary('id'),否则可能因数据库默认行为导致主键未正确设置。
2. Model 配置:禁用自增属性并自动生成 UUID

在对应的 Eloquent Model 中完成两项核心设置:

class YourModel extends Model{ public $incrementing = false; // 禁用自增行为 protected static function boot() { parent::boot(); static::creating(function ($model) { if (empty($model->id)) { // 仅当 id 为空时生成 $model->id = (string) Str::uuid(); // 使用 Laravel Helper 生成 UUID } }); }}

  • 原理:通过 boot() 方法监听 creating 事件,在记录插入数据库前自动填充 UUID。
  • 注意:需引入 IlluminateSupportStr 类,或直接使用 Uuid 包(如 ramsey/uuid)。
3. 代码复用:封装为 Trait

为避免重复代码,可将 UUID 逻辑提取为 Trait:

trait UsesUuid{ public $incrementing = false; protected static function bootUsesUuid() { static::creating(function ($model) { if (empty($model->getKey())) { // getKey() 兼容非 id 主键 $model->{$model->getKeyName()} = (string) Str::uuid(); } }); }}

  • 使用方式:在 Model 中直接引入 Trait:
class YourModel extends Model{ use UsesUuid; // 其他配置...}4. 验证效果:API 返回示例

通过控制器返回数据时,主键将显示为 UUID 格式:

public function show($id){ return response()->json(YourModel::findOrFail($id));}

  • 输出结果
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Example", // 其他字段...}补充说明
  • UUID 版本:Laravel 默认使用 UUID v4(随机生成),如需 v1(时间戳)或 v5(命名空间),需引入 ramsey/uuid 包。
  • 数据库兼容性:MySQL 5.7+、PostgreSQL 等主流数据库均支持 UUID 类型,低版本需存储为 CHAR(36)。
  • 性能考量:UUID 比自增 ID 占用更多存储空间,且作为主键时可能影响索引效率,建议仅在有安全或分布式需求时使用。

通过以上步骤,即可在 Laravel 5.6 中实现完整的 UUID 集成,同时保持代码的简洁性与可维护性。