目的
以前、 goldspecdigital/laravel-eloquent-uuid ライブラリを利用して主キーをUUIDに変更する記事を書いていました。
Laravel9以降は HasUuids トレイトが利用できるようになりました!
ということでやっていきます。
環境
- PHP: 8.3.11
- Laravel: 11.23.5
UUID とは
Universally Unique Identifierの略。
重複する可能性が無視できるほど小さく、一意な識別子として扱えるIDです。
生成方法によりバージョン1からバージョン5までの種類があり、今回使用するのはバージョン4になります。
UUID のメリット
- IDにID以外の意味を持たせないため
- 複数のデータベースで分散してデータを持つ場合に有用
- データを移行の際にもプライマリーキーの重複を避けられる
- URLからIDの予測が付きにくい
手順
users マイグレーションを修正する
database/migrations/0001_01_01_000000_create_users_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
// $table->id();
$table->uuid('id')->primary(); // 追記
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password')->nullable();
$table->string('avatar')->nullable();
$table->string('google_id')->nullable();
$table->rememberToken();
$table->timestamps();
});
// ...
}
};
User モデルを修正する
HasUuids
トレイトをモデルに追加します。
app/Models/User.php
class User extends Authenticatable
{
use HasFactory, HasUuids, Notifiable; // 追記
// ...
}
データベースの再生成
$ php artisan migrate:fresh --seed
動作確認
users
テーブルの id
カラムが uuid
になっていることを確認します。
$ php artisan tinker
> App\Models\User::first()
= App\Models\User {#6174
id: "9d2e8ce1-e7c5-46f5-91a8-ade9a7c296ba",
name: "小泉 洋介",
email: "gsuzuki@example.org",
email_verified_at: "2024-10-07 01:36:16",
#password: "$2y$12$h7pTeIY73t9IxlH97ridZeNDplh1qYHEdNc5IWlUhWBX1A7PdbwuC",
avatar: "https://via.placeholder.com/640x480.png/008866?text=neque",
google_id: "6746",
#remember_token: "ctzEykq0O7",
created_at: "2024-10-07 01:36:16",
updated_at: "2024-10-07 01:36:16",
}