0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel 9 Eloquent の設定(主キーの UUID への変更・タイムスタンプのミリ秒への変更)

Last updated at Posted at 2022-11-02

備忘録として、UUID への変更と、タイムスタンプのミリ秒への変更についてまとめています。

※データベースは、MySQL を利用しています。

主キーの UUID への変更

HasUuids トレイト

Laravel9 では、HasUuids という名前のトレイトが用意されていおり、簡単に UUID へ変更できます。

goldspecdigitalなどのライブラリの使用や、model への独自のコードの追加により、UUID へ変更する方法もありますが、今回は Laravel で用意されている HasUuids を使います。

モデルファイルの変更

HasUuids トレイトを利用できるように変更します。

app/models/User.php
+ use Illuminate\Database\Eloquent\Concerns\HasUuids;
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
+   use HasUuids;
}

HasUuidsトレイトはデフォルトで、モデルに対し順序付き(ordered)UUIDを生成します。
もし、バージョン4 の UUID を利用したい場合は、以下のコードを追加してください。

app/models/User.php
use Illuminate\Database\Eloquent\Concerns\HasUuids;
+ use Ramsey\Uuid\Uuid;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    use HasUuids;

+   public function newUniqueId()
+   {
+       return (string) Uuid::uuid4();
+   }

+   public function uniqueIds()
+   {
+        return ['id'];
+   }

}

さらに詳しく知りたい方は、公式ドキュメントをご覧ください。

主キーを変更

マイグレーションファイルを変更します。

app/database/migrations/2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
-   $table->id();
+   $table->uuid('id')->primary();
    $table->string('name');
}

以上で、UUID への変更が完了です。

ミリ秒への対応

Laravel では、時刻を保存する際、2022-11-02 12:24:31.000 のように 小数点以下が 0 になります。

$table->timestamps(); を変更

マイグレーションファイルを変更します。

ミリ秒への変更とは話がそれますが、データベースに MySQL を利用している場合、2038 年問題への対応として、timestamp 型から datetime 型に変更しておいた方が安全みたいなので、dateTime 型でミリ秒対応します。

PostgreSQL の場合、$table->timestamps(3); のように精度を指定するだけでいいかもしれません。
正直、詳しくないので、ご自身で調べてください。

app/database/migrations/2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
-   $table->timestamps();
+   $table->dateTime('created_at', 3)->nullable();
+   $table->dateTime('updated_at', 3)->nullable();
}

$table->dateTime() の第二引数に精度を指定します。

モデルファイルの変更

マイグレーションファイルの変更だけでは、モデルを利用してデータベースに保存する際にミリ秒にならないので、モデルファイルも変更します。

app/models/User.php
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The storage format of the model's date columns.
     *
     * @var string
     */
+   protected $dateFormat = 'Y-m-d H:i:s.v';
}

以上で、ミリ秒への変更が完了です。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?