blogs

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

概要

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

目的

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

  • SuitID1caseを参照する
  • 参照したcaseに対してlabelメソッドを用いてラベル名を取得する。
  • 下記 Enum の場合、ハートが返却されること
<?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 メソッドの例

  • 日本語名を返却する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();

参考文献

公式ドキュメント

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