CUIDとは?
衝突しにくいユニークな識別子を生成するための手法。
時系列性があり、ソートで並べることが可能。
前提
- Laravelのセットアップは済んでいるものとする
動作環境・使用するツールや言語
- OS バージョン
- Windows11
- ツール
- VSCode
- 言語
- PHP 8.1
- フレームワーク
- Laravel8
パッケージのインストール
今回は、こちらのパッケージを使用しました。
PHPコンテナ内
composer require visus/cuid2
- インストール成功すると、
vendor\visus\cuid2\src
ファイル等が自動作成される
マイグレーションファイル
create_users_table.php
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->string('cuid', 25)->primary()->unique();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
- idは今回無しで、cuidをプライマリーキーとしてユニーク使用。
モデル
User.php
use Visus\Cuid2\Cuid2;
class User extends Authenticatable
{
~~
protected $fillable = [
'name',
'email',
'password',
];
// 今回はcuidが主キーなので使用するので、主キーが文字列ですよ宣言
protected $keyType = 'string';
// 今回はcuidが主キーなので、主キーを自動的にインクリメントしないで宣言
public $incrementing = false;
/**
* モデルのイベントライフサイクルをカスタマイズするためのメソッド。
*
* このメソッドは、モデルがデータベースに保存される前に呼び出され、
* 新しく作成されるモデルインスタンスに対して'cuid' フィールドが必ず設定される。
*/
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
if (empty($model->cuid)) {
$cuid = new Cuid2();
$model->cuid = $cuid->toString();
}
});
}
~~
}
シーダーファイル
UserTabelSeeder.php
use Illuminate\Support\Facades\Hash;
use App\Models\User;
class UserTableSeeder extends Seeder
{
public function run()
{
$users = [
[
'name' => 'AAA',
'email' => 'a@example.com',
'password' => Hash::make('passwordA'),
],
[
'name' => 'BBB',
'email' => 'b@example.com',
'password' => Hash::make('passwordB'),
],
[
'name' => 'CCC',
'email' => 'c@example.com',
'password' => Hash::make('passwordC'),
],
];
// foreachでUserモデルのboot()を繰り返し呼び出し、cuidをそれぞれ設定
foreach ($users as $user) {
User::create($user);
}
}
}
その後、DatabaseSeeder.phpにUserTabelSeeder.phpを登録。
結果
PHPコンテナ内
php artisan make:migrate --seed
を実行すると、
見事cuidでデータが生成、保存されていました。