LoginSignup
34
29

More than 1 year has passed since last update.

Laravel Eloquent の主キー(ID)を UUID に変更する

Last updated at Posted at 2020-08-19

UUID とは

Universally Unique Identifierの略。
重複する可能性が無視できるほど小さく、一意な識別子として扱えるIDです。

生成方法によりバージョン1からバージョン5までの種類があり、今回使用するのはバージョン4になります。

UUID のメリット

  • IDにID以外の意味を持たせないため
  • 複数のデータベースで分散してデータを持つ場合に有用
  • データを移行の際にもプライマリーキーの重複を避けられる
  • URLからIDの予測が付きにくい

利用するパッケージ

今回はこちらのパッケージを利用してUUIDを使えるようにします。

環境

  • PHP: 7.4.6
  • Laravel: 7.25.0
  • goldspecdigital/laravel-eloquent-uuid: 7.0.0

導入手順

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

goldspecdigital/laravel-eloquent-uuid7.x 系はLaravelのバージョン '7.x' に対応しています。

使い方

users マイグレーションを修正する

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
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            // Primary key.
            $table->uuid('id')->primary();

            // ...
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}

posts マイグレーションを作成する

$ php artisan make:migration create_posts_table
<?php

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

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table): void {
            // Primary key.
            $table->uuid('id')->primary();

            // Foreign key.
            $table->uuid('user_id');
            $table->foreign('user_id')->references('id')->on('users');

            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

マイグレーションを実行する

$ php artisan migrate

User モデルを修正する

継承するクラスを Illuminate\Foundation\Auth\User から GoldSpecDigital\LaravelEloquentUUID\Foundation\Auth\User に変更します。

app/User.php
<?php

namespace App;

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

class User extends Authenticatable
{
    // ...
}

Post モデルを作成する

make コマンドが用意されているので利用します。

$ php artisan uuid:make:model Post

GoldSpecDigital\LaravelEloquentUUID\Database\Eloquent\Model を継承してモデルクラスを作成する方法が推奨されています。

app/Post.php
<?php

namespace App;

use GoldSpecDigital\LaravelEloquentUUID\Database\Eloquent\Model;

class Post extends Model
{
}

Post モデルファクトリーを作成

$ php artisan make:factory PostFactory
database/factories/PostFactory.php
<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Model;
use Faker\Generator as Faker;

$factory->define(Model::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence,
        'body' => $faker->text,
    ];
});

tinkerでUUIDを生成する

$ php artisan tinker

$user = factory(App\User::class)->create();
=> App\User {#3197
     name: "Terrell Stroman",
     email: "ulehner@example.com",
     email_verified_at: "2020-08-19 13:30:17",
     id: "5e4e81de-45ae-468b-b33c-4c6109ded561",
     updated_at: "2020-08-19 13:30:17",
     created_at: "2020-08-19 13:30:17",
   }

$post = factory(App\Post::class)->create(['user_id' => $user->id]);
=> App\Post {#4124
     title: "Sed quisquam dignissimos facilis distinctio.",
     body: "Adipisci placeat sit ut nam sunt. Magni harum non sed eveniet tempore consequatur. Magnam quod qui omnis ducimus. Ex nulla occaecati adipisci. Itaque quas eum similique porro delectus accusantium.",
     user_id: "5e4e81de-45ae-468b-b33c-4c6109ded561",
     id: "7b19a935-357b-40f7-9be7-f69eb8eb6e30",
     updated_at: "2020-08-19 13:31:28",
     created_at: "2020-08-19 13:31:28",
   }

User, Post モデルのidにUUIDがセットされていることが確認できればokです。

参考

34
29
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
29