LaravelでBacked Enumを用いた際に、valueからcaseを参照する方法

16539 ワード

概要

Laravel で Backed Enum を用いた際に個人的に詰まったポイントがあったので、まとめました。

目的

Laravel で Backed Enum に定義したvalueからlabelを参照する

  • SuitID1caseを参照する
  • 参照したcaseに対してlabelメソッドを用いてラベル名を取得する。
  • 下記 Enum の場合、ハートが返却されること
app/Enums/Suit.php
<?php

namespace App\Enums

enum Suit
{
    case Hearts = 1;
    case Diamonds = 2;
    case Clubs = 3;
    case Spades = 4;

    public function label(): string
    {
      return match ($this) {
        Suit::Hearts => 'ハート',
        Suit::Diamonds => 'ダイヤモンド',
        Suit::Clubs => 'クラブ',
        Suit::Spades => 'スペード',
      }
    }
}

結論

fromメソッドの引数にvalueを指定することで、取得できる。

use App\Enum\Suit;

// 取得したいSuitのvalueを指定する
$suit_value = 1;

// valueから該当のSuitを取得し、labelメソッドでラベル名を取得する
$suit_label = Suit::from($suit_value)->label();

PHP8.1 から追加された Enum について

Enum 型を使えば、簡単に 複数の定数を定義できます。

定義例

app/Enums/Suit.php
<?php

namespace App\Enums

enum Suit
{
    case Hearts;
    case Diamonds;
    case Clubs;
    case Spades;
}

Backed Enum

Enum 型に値を持たせることもできます。
値に依存した Enum をBacked Enumと呼びます。

app/Enums/Suit.php
<?php

namespace App\Enums

enum Suit
{
    case Hearts = 1;
    case Diamonds = 2;
    case Clubs = 3;
    case Spades = 4;
}