【Laravel6】プライマリーキーがuuid用のmodelをtraitで作成する方法
プライマリーキーをuuidにするmodelがたくさんある場合、それぞれのmodelにprimarykeyの型や、インクリメントの無効化、レコード挿入時のプライマリーキーにuuid自動挿入などのコードを書くのは面倒。
ということでtraitでuuidモデルを作って、各modelにuseできるようにしました。
uuidモデルのコード
UuidModel.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
trait UuidModel
{
protected static function bootUuidModel()
{
// レコード作成時にprimary keyに自動的にuuidを入れてくれるようにする
static::creating(function ($model) {
$model->{$model->getKeyName()} = (string) Str::uuid();
});
}
/**
* Get the value indicating whether the IDs are incrementing.
* Modelクラスの自動連番をオーバーライド
*
* @return bool
*/
public function getIncrementing()
{
return false;
}
/**
* Set whether IDs are incrementing.
* Modelクラスのプライマリーキーの型をオーバーライド
*
* @param bool $value
* @return $this
*/
public function getKeyType()
{
return 'string';
}
}
UserモデルにUuidModelをtrait
デフォルトのUser.phpにUuidModelをuse
User.php
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
// UuidModelをインポート
use App\UuidModel;
class User extends Authenticatable
{
// UuidModelをuseに入れる
use Notifiable, UuidModel;
// 省略
デフォルトのUserのマイグレーションファイルのプライマリーキーをuuidに変更
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) {
// 元のprimarykeyを削除
// $table->bigIncrements('id');
// primarykeyをuuidにして追記
$table->uuid('id')->primary()->comment('ユーザーID');
// 以下省略
補足
UuidModel.phpのtraitでbootUuidModel()という関数を使用している。
boot+"trait名"という名前で関数を作成するとこれをuseしたEloquentはboot時にこの静的メソッドを同時に呼ぶようになります。
ディスカッション
コメント一覧
まだ、コメントがありません