关键词

Laravel自动生成UUID,从建表到使用详解

下面是“Laravel自动生成UUID,从建表到使用详解”的完整攻略。

1. 什么是UUID

UUID是Universally Unique Identifier(通用唯一标识符)的缩写,是一种标准的32位数字和字母的组合,可以用来唯一标识一个实体,与数据类型无关,具有唯一性和跨平台性。在Laravel中,可以使用UUID来替代自增长的id作为模型的主键。

2. 建表时自动生成UUID字段

在创建表时,需要添加uuid类型的字段,Laravel提供了uuid()方法来实现:

Schema::create('users', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

需要注意的是,需要将生成的uuid字段作为主键,并且将主键的类型设置为uuid类型。

3. 模型使用UUID作为主键

在模型类中,需要将主键的类型设置为uuid,并且自动增长的id属性需要设置为false,如下:

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public $timestamps = true;
    public $incrementing = false;
    protected $keyType = 'string';
}

需要注意的是,$incrementing属性需要设置为false,表示不使用自增长的id属性。

4. 自动生成UUID的方式

Laravel提供了两种方式来实现自动生成UUID:

4.1. 使用UUID作为默认值

在创建表时,可以使用default()方法来将uuid()方法生成的UUID作为默认值:

$table->uuid('uuid')->primary()->default(DB::raw('uuid_generate_v4()'));

需要注意,这种方式需要依赖数据库的默认值生成函数,比如PostgreSQL中的uuid_generate_v4()函数。

4.2. 使用模型事件生成UUID

另一种方式是通过模型事件自动生成UUID。在模型保存之前,将UUID赋值给模型主键,如下:

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

class User extends Model
{
    public static function boot()
    {
        parent::boot();

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

在模型创建且未设置主键值时,Laravel会在执行creating事件时自动生成UUID并设置为主键。

示例说明

示例一:使用UUID作为User模型的主键

  1. 创建users表,将主键设置为uuid类型,生成的uuid作为默认值:
Schema::create('users', function (Blueprint $table) {
    $table->uuid('id')->primary()->default(DB::raw('uuid_generate_v4()'));
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});
  1. 将User模型的主键类型设置为string,将自增长的id属性设置为false:
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public $timestamps = true;
    public $incrementing = false;
    protected $keyType = 'string';
}

示例二:使用模型事件生成UUID作为Post模型的主键

  1. 创建posts表,将主键设置为uuid类型,自动生成UUID:
Schema::create('posts', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->string('title');
    $table->text('content');
    $table->timestamps();
});
  1. 将Post模型的主键类型设置为string,将自增长的id属性设置为false,并在模型事件中自动生成UUID:
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

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

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

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

以上就是“Laravel自动生成UUID,从建表到使用详解”的完整攻略和两条示例说明。

本文链接:http://task.lmcjl.com/news/7898.html

展开阅读全文