下面是“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模型的主键
- 创建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();
});
- 将User模型的主键类型设置为string,将自增长的id属性设置为false:
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public $timestamps = true;
public $incrementing = false;
protected $keyType = 'string';
}
示例二:使用模型事件生成UUID作为Post模型的主键
- 创建posts表,将主键设置为uuid类型,自动生成UUID:
Schema::create('posts', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('title');
$table->text('content');
$table->timestamps();
});
- 将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,从建表到使用详解”的完整攻略和两条示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Laravel自动生成UUID,从建表到使用详解 - Python技术站