【Laravel6】プライマリーキー(primary key)をuuidに変更する方法

Laravel

スポンサーリンク

プライマリーキーを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

以上。

Laravel

Posted by ton