下面是“Laravel自动生成UUID,从建表到使用详解”的完整攻略。
UUID是Universally Unique Identifier(通用唯一标识符)的缩写,是一种标准的32位数字和字母的组合,可以用来唯一标识一个实体,与数据类型无关,具有唯一性和跨平台性。在Laravel中,可以使用UUID来替代自增长的id作为模型的主键。
在创建表时,需要添加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类型。
在模型类中,需要将主键的类型设置为uuid,并且自动增长的id属性需要设置为false,如下:
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public $timestamps = true;
public $incrementing = false;
protected $keyType = 'string';
}
需要注意的是,$incrementing属性需要设置为false,表示不使用自增长的id属性。
Laravel提供了两种方式来实现自动生成UUID:
在创建表时,可以使用default()方法来将uuid()方法生成的UUID作为默认值:
$table->uuid('uuid')->primary()->default(DB::raw('uuid_generate_v4()'));
需要注意,这种方式需要依赖数据库的默认值生成函数,比如PostgreSQL中的uuid_generate_v4()函数。
另一种方式是通过模型事件自动生成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并设置为主键。
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();
});
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public $timestamps = true;
public $incrementing = false;
protected $keyType = 'string';
}
Schema::create('posts', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('title');
$table->text('content');
$table->timestamps();
});
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