備忘録として、UUID への変更と、タイムスタンプのミリ秒への変更についてまとめています。
※データベースは、MySQL を利用しています。
主キーの UUID への変更
HasUuids トレイト
Laravel9 では、HasUuids という名前のトレイトが用意されていおり、簡単に UUID へ変更できます。
goldspecdigitalなどのライブラリの使用や、model への独自のコードの追加により、UUID へ変更する方法もありますが、今回は Laravel で用意されている HasUuids を使います。
モデルファイルの変更
HasUuids トレイトを利用できるように変更します。
+ use Illuminate\Database\Eloquent\Concerns\HasUuids;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
+ use HasUuids;
}
HasUuidsトレイトはデフォルトで、モデルに対し順序付き(ordered)UUIDを生成します。
もし、バージョン4 の UUID を利用したい場合は、以下のコードを追加してください。
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'];
+ }
}
さらに詳しく知りたい方は、公式ドキュメントをご覧ください。
主キーを変更
マイグレーションファイルを変更します。
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);
のように精度を指定するだけでいいかもしれません。
正直、詳しくないので、ご自身で調べてください。
Schema::create('users', function (Blueprint $table) {
- $table->timestamps();
+ $table->dateTime('created_at', 3)->nullable();
+ $table->dateTime('updated_at', 3)->nullable();
}
$table->dateTime() の第二引数に精度を指定します。
モデルファイルの変更
マイグレーションファイルの変更だけでは、モデルを利用してデータベースに保存する際にミリ秒にならないので、モデルファイルも変更します。
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';
}
以上で、ミリ秒への変更が完了です。