blogs

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

概要

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

目的

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

<?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 型を使えば、簡単に 複数の定数を定義できます。

定義例

<?php

namespace App\Enums

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

Backed Enum

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

<?php

namespace App\Enums

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

参照方法

Backed Enumに定義した内容は、以下のようにEnumのクラス名+変数名+valueで参照できます。

<?php

use App\Enum\Suit;

Route::get('/', function () {

  var_dump(Suit::Hearts->value)
  // 1
});

また、下記のように新たにメソッドを定義することもできます。

label メソッドの例

<?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 => 'スペード',
      }
    }
}

定義した内容は、以下のようにEnumのクラス名+変数名+メソッド名で参照できます。

<?php

use App\Enum\Suit;

Route::get('/', function () {

  var_dump(Suit::Hearts->label())
  // 1
});

本題

Heartsvaluelabelを取得する場合は上記の方法で可能ですが、value2caseを取得したい場合は、どうすれば良いでしょうか?

方法

Backed Enum にはfrom メソッドがあり、value を引数にしてすることで、該当のcaseを参照することができます。

use App\Enum\Suit;

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

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

参考文献

公式ドキュメント

記事作成時に参考にさせていただいたブログ様