🔎

Laravel の 現在と将来の UUID バージョン事情のまとめ

2024/09/03に公開

前置き

現状(2024年9月時点)における Laravel の UUID バージョン事情を少し整理してみました。

参考にしているプルリクは以下(及びそのリンク先)です。
[12.x] Switch models to UUID v7 #52433

以前私の書いた記事も良ければ参考に。
Laravel UUID、ULID で遊んでみる

下の本文に出てきますが、Laravel には Laravel 独自カスタマイズ版の UUID4 というのがあります。(本来の UUID4 ではない)

本題

という事で、手短に行きます。
現状では、Illuminate\Support\Str には、以下のようなメソッドがあります。

Str::uuid() … 本来の UUID4 を返す
Str::uuid7() … UUID7 を返す(Ver.11.17 にて登場)
Str::orderedUuid() … 本来の UUID4 ではなくカスタマイズされたソート可能版の(時間情報を含んだ)UUID4 を返す

また、モデルに UUID をサクッと付与できる為の以下のトレイトがあります。

(Illuminate\Database\Eloquent\Concerns\以下)
HasUuids トレイト … 上記の Str::orderedUuid() を使ったトレイト
HasVersion7Uuids トレイト … UUID7 を使ったトレイト(Ver.11.17 にて登場したが…)

Ver.11.17 にて UUID7 を利用するトレイトが増えました。理由としては、MariaDB だと HasUuids トレイトが利用する Str::orderedUuid() を使うと不具合があったからで、その対策としての追加になっています。Str::uuid() を使った時は本来の UUID4 を返すのに、HasUuids トレイトではそうではないのは、微妙にややこしいですね。

Laravel 12 での予定

以下は、Laravel 12 で変わる予定の内容です。もちろん執筆時点では、まだまだ Laravel 12 は出ず、今後変わる可能性はありますので予めご了承下さい。

Ver.11.17 で登場した HasVersion7Uuids トレイトは無くなります。代わりに HasUuids トレイトが UUID7 を使うようになります。

ですので、これらのトレイトを使っている場合は、Ver.12 へバージョンアップ時に適宜対応が必要になりますね。Laravel 12では、以下の2つになる予定です。

HasUuids トレイト … UUID7 を使う
HasVersion4UuidsStr::orderedUuid() を使う

要は HasUuids トレイトのデフォルトは、UUID7 になるという事ですね。

そこで微妙にややこしいのは、Str::uuid() を使った際は、今まで通りの UUID4 の予定です。
「そっちも UUID7 にしちゃいなよ!🍺」と思いたい所ですが、そこは微妙なプライバシー問題を考慮したようで「UUID7 は時間情報を含んでいるから、ちょっとデフォルトにするのは良くないよね~」的な感じで却下されています。

「では、トレイトは何故 UUID7 にしたのさ?」と思ってしまう所ですが、HasUuids トレイトは、元々時間情報を含む版の UUID4 が使われているので、そこは今までと変わらないから UUID7 にしちゃおう、となりました。

以上です。

雑感

微妙にややこしいですね。
おかしな所等がありましたらコメント下さい。

Discussion