【Laravel6】プライマリーキー(primary key)をuuidに変更する方法
プライマリーキーをuuidにする方法を紹介します。
LaravelのAuth認証機能のUsersテーブルのプライマリーキーはデフォルトでは、bigIncrementsで実装されていますよね。
これをuuidに変更しようと思います。
Usersテーブルのprimary keyをuuidに変更
[database/migrations/yyyy_mm_dd_000000_create_users_table.php]※一部抜粋
// 省略---------------
public function up()
{
Schema::create('users', function (Blueprint $table) {
// $table->bigIncrements('id'); // 削除
$table->uuid('id')->primary(); // 追加
// 省略---------------
Usersモデルを修正
[app/User.php]一部抜粋
use Illuminate\Support\Str; // 追加
class User extends Authenticatable implements MustVerifyEmail
{
// 省略---------------
// primaryKeyのカラム名を入れる
protected $primaryKey = 'id';
// uuidなのでインクリメントはしないようにする(デフォルトはtrue)
public $incrementing = false;
// primary keyの型をuuidに合わせる(デフォルトはint)
protected $keyType = 'string';
protected static function boot()
{
parent::boot();
// レコード作成時にprimary keyに自動的にuuidを入れてくれるようにする
static::creating(function ($model) {
$model->{$model->getKeyName()} = (string) Str::orderedUuid();
});
}
// 省略---------------
boot()メソッドをオーバーライドして処理を追加したことにより、Usersテーブルにレコードを追加する際に、自動的にprimary keyのカラムにuuidを入れてくれるようになる。
この処理を入れない場合は、Usersテーブルにレコードを追加する処理を記載するたびに、primary keyのカラムにuuidを入れる処理を書かなければいけない。
ちなみに今回使用したStr::orderedUuid()は時系列にそってuuidを生成してくれるものです。
(補足)Str::orderedUuid()使用時にエラーが出たら。
Str::orderedUuid()を使用した際に以下のようなエラーが出たら、
Ramsey\Uuid\Exception\UnsatisfiedDependencyException : Cannot call Ramsey\Uuid\Converter\Number\DegradedNumberConverter::toHex without support for large integers, since integer is an unsigned 128-bit integer; Moontoast\Math\BigNumber is required.
Str::orderedUuid()を利用するためのライブラリがインストールされていないので、以下のコマンドでインストールする。
composer require moontoast/math
以上。
ディスカッション
コメント一覧
まだ、コメントがありません