🦆
Laravel(+Livewire)でEnumを使う
Laravel8.7あたりから導入されたEnum機能を使った実装の備忘録
追加・編集するファイルは以下。
- マイグレーションファイル
- Enum定義ファイル(新規で作成)
- モデルファイル
- Livewire コンポーネントファイル
- bladeファイル
マイグレーションファイル
# (前略)
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('slug', 100);
$table->string('title', 255)->nullable();
$table->text('body')->nullable();
// enum型ではなく、tinyintでカラムを作成。
$table->tinyInteger('status')->unsigned()->nullable()->default(1);
$table->timestamps();
$table->unique('slug');
});
}
# (後略)
Enum定義ファイル
<?php
namespace App\Enums;
enum PostStatus: int
{
case Draft = 1;
case Active = 2;
case Archived = 3;
// 画面表示する際の文字列を定義
public function getString(): string
{
return match($this)
{
self::Draft => 'draft',
self::Active => 'active',
self::Archived => 'archived',
};
}
}
モデルファイル
<?php
namespace App\Models;
use App\Enums\PostStatus; // 作成したEnum定義ファイルの読み込み
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'slug',
'title',
'body',
'status',
];
// Enumキャストの記述を追加
protected $casts = [
'status' => PostStatus::class,
];
}
Livewire コンポーネントファイル
<?php
namespace App\Http\Livewire;
use App\Enums\PostStatus; // Enum定義ファイルの読み込み
use App\Models\Post;
use Illuminate\Validation\Rules\Enum; // ルールのEnumを追加読み込み
use Livewire\Component;
class Posts extends Component
{
public Post $post;
protected function rules() : array
{
return [
'post.slug' => ['required', 'string', 'unique:posts'],
'post.title' => ['required', 'string'],
'post.body' => ['nullable', 'string'],
'post.status' => ['required', new Enum(PostStatus::class)], // バリデーションルールにEnumを使用
];
}
public function mount()
{
$this->post = new Post;
}
public function render()
{
return view('livewire.posts');
}
}
bladeファイル
(省略)
文字を表示したい時は $post->status->getString()
値を保存する時は $post->status = PostStatus::Active
Enumをforeachなどで回したい時は $post->status->cases()
Discussion