【Laravel6】プライマリーキーがuuid用のmodelをtraitで作成する方法

Laravel

スポンサーリンク

プライマリーキーをuuidにするmodelがたくさんある場合、それぞれのmodelにprimarykeyの型や、インクリメントの無効化、レコード挿入時のプライマリーキーにuuid自動挿入などのコードを書くのは面倒。

ということでtraitでuuidモデルを作って、各modelにuseできるようにしました。

uuidモデルのコード

UuidModel.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;


trait UuidModel
{
    protected static function bootUuidModel()
    {
        // レコード作成時にprimary keyに自動的にuuidを入れてくれるようにする
        static::creating(function ($model) {
            $model->{$model->getKeyName()} = (string) Str::uuid();
        });
    }

    /**
     * Get the value indicating whether the IDs are incrementing.
     * Modelクラスの自動連番をオーバーライド
     *
     * @return bool
     */
    public function getIncrementing()
    {
        return false;
    }

    /**
     * Set whether IDs are incrementing.
     * Modelクラスのプライマリーキーの型をオーバーライド
     *
     * @param  bool  $value
     * @return $this
     */
    public function getKeyType()
    {
        return 'string';
    }
}

UserモデルにUuidModelをtrait

デフォルトのUser.phpにUuidModelをuse

User.php

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
// UuidModelをインポート
use App\UuidModel;

class User extends Authenticatable
{
    // UuidModelをuseに入れる
    use Notifiable, UuidModel;
// 省略

デフォルトのUserのマイグレーションファイルのプライマリーキーをuuidに変更

2014_10_12_000000_create_users_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            // 元のprimarykeyを削除
            // $table->bigIncrements('id');
            // primarykeyをuuidにして追記
            $table->uuid('id')->primary()->comment('ユーザーID');
// 以下省略

補足

UuidModel.phpのtraitでbootUuidModel()という関数を使用している。

boot+"trait名"という名前で関数を作成するとこれをuseしたEloquentはboot時にこの静的メソッドを同時に呼ぶようになります。

Laravel

Posted by ton