自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

Laravelで主キーにUUIDを実装させる方法【laravel-eloquent-uuid】

thumbnail

主キーにUUIDを使用することで、デフォルトの連番で数値型のIDと違って予測されることがない。これはセキュリティ上、重要なことなのでなるべく開発初期段階で実装したい。

実装方法

UUID実装用のライブラリをcomposerからインストール。

composer require goldspecdigital/laravel-eloquent-uuid:^7.0

ユーザーモデルを書き換える。database/migrations/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) {
            $table->uuid("id")->primary(); // ←uuidに
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

次、app/User.phpを編集。

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
#use Illuminate\Foundation\Auth\User as Authenticatable;
use GoldSpecDigital\LaravelEloquentUUID\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

この状態でマイグレーション実行。既にDBにマイグレーションした場合、DBを削除してから実行する。

php artisan migrate

今後、新しくマイグレーションファイルを作る場合、下記のように記述してUUIDを使用する

<?php

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

class CreateMemosTable extends Migration
{
    public function up()
    {
        Schema::create('memos', function (Blueprint $table) {
            $table->uuid("id")->primary();
            $table->string("body");
            $table->string("color");
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('memos');
    }
}

モデルも下記のようにUUID対応のモデルを継承して作るようにする。

<?php

namespace App;

#use Illuminate\Database\Eloquent\Model;
use GoldSpecDigital\LaravelEloquentUUID\Database\Eloquent\Model;

class Memo extends Model
{
    protected $fillable = [
        "body","color"
    ];

}

結論

ユーザーモデルにも数値型かつオートインクリメントのIDが指定されているので、UUIDを実装したい場合は、上記手続きを忘れないように実行するべし。

デフォルトの数値型IDでマイグレーションして、ユーザーのデータを追加し、そこからUUIDに切り替えようとするのは大変なので、なるべくプロジェクト開始直後からUUIDの実装を心がけたい。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ