【Laravel】enum(列挙型)とは:laravel-enumの使用方法

時計 2023.11.18 / 時計

【Laravel】enum(列挙型)とは:laravel-enumの使用方法

記事ではLaravelenum列挙型)を扱えるようになるlaravel-enumの使用方法について解説していきます。

enumとは値が変化しない複数の定数をまとめるリストのような機能のことです。enumを利用することでコードの明確性や保守性の向上、エラー防止に役立ちます。

ぜひ本記事を通して、Laravelのenumパッケージであるlaravel-enumについて理解を深めてください。

enum(列挙型)

enum(列挙型)とは

enum(列挙型)とはPHP8.1から導入された新機能です。enumは英語の「enumeration」の略であり、意味は「列挙」や「目録」、「一覧表」といった意味を持っています。

enumを使うことで値が変化しない定数のリストのようなものを作成できます。いくつかの定数を一つの型で統一して管理できるようになります。

つまり複数の定数をまとめて管理できる機能ということです。

enumは「列挙型」というデータ型であり、PHPだけでなく他の言語でも同じように利用されます。

laravelにはPHPにenumが導入される前から「laravel-enum」というパッケージを使ってenumが利用されてきました。本記事でも「laravel-enum」を中心にenumの使い方を解説していきます。

enumの特徴

enumの特徴は以下の通りです。

  1. 事前に定義した複数の定数セットを提供する
  2. コードの読みやすさ(可読性)が向上し、コードの保守性が上がる
  3. 定義された値以外の値は使用できないため安全性が向上する
  4. 定数は定義された型に制限される(型安全)
  5. 関連する定数をまとめて整理・管理できる

enumの使用用途

enumは様々な使用用途が考えられます。定数をまとめて管理するために利用されることもありますが、代表的な用途としてはデータの表記を統一する用途が多いかなと思います。

例えばデータベースではUserの権限を「1」や「2」で登録していた場合、これをそのまま表示してはユーザーには意味が分かりませんよね。かといって1の場合は「〇〇」、2の場合は「〇〇」といったUser権限テーブルを新たに作成するのも面倒です。

そこでenumを使うことで、Userの権限が「1」の場合はAdministrator、「2」の場合は一般ユーザーといった風にユーザーの画面に表示されるようなことができます。

またテーブルで状態・フラグを表すフィールドでは「公開・非公開」、「未読・既読」といった状態をboolean型で「0」または「1」でデータベースに登録します。これらboolean型の数値をサイト表示時には文字列として扱う場合にenumは活躍します。

なぜBoolean型で登録するのか

ここで疑問が一つ湧いてきませんか?なぜ「公開・非公開」や「未読・既読」という文字列を直接データベースに登録しないのかと。

公開・非公開のようなフラグをBoolean型(0または1)で登録するのは以下の利点があるからです。

Boolean型で登録する利点
  • 効率とパフォーマンスの向上
  • データサイズを小さくする
  • 将来の拡張性
  • 明確性

Boolean型(0または1)は効率的にデータベースに格納・処理することができ、パフォーマンスを向上させます。データも0か1なのでデータサイズも小さくすみます。

また0がなし(非公開や未読)、1があり(公開や既読)と意味がはっきりしているため、データの解釈が容易です。

将来的にフラグを追加する場合でも、データ型を例えば整数型に変更して新たに2(限定公開)を追加するといった拡張を行うこともできます。

もしBoolean型でなく文字列で保存した場合、データサイズが大きくなり、処理速度も低下する可能性が高くなります。

enumの使用例

PHPでenumを利用する場合は次のように記述して利用します。

<?php

namespace App\Enums;

enum UserRole: int
{
    case administrator = 1;
    case member = 2;
    case guest = 3;
}

laravel-enumの使用方法

laravel-enumのインストール

まずは現在のプロジェクトにlaravel-enumをインストールします。以下コマンドを実行してlaravel-enumをインストールしてください。

composer require bensampo/laravel-enum

enumファイルの生成

以下コマンドを実行することでenumで利用するファイルが自動生成されます。

php artisan make:enum UserType

上記のコマンドを実行するとappフォルダ内に「Enums」フォルダが生成され、その中にはUserType.phpというファイルが生成されます。

Laravel Enum:Enumsフォルダ

UserType.phpを開くと次のように記述されています。

<?php declare(strict_types=1);

namespace App\Enums;

use BenSampo\Enum\Enum;

final class UserType extends Enum
{
    const OptionOne = 0;
    const OptionTwo = 1;
    const OptionThree = 2;
}

上記コードをご自身のWebアプリケーションに合った内容に編集して使用します。

laravel-enumの基本的な使用方法

laravel-enumの基本的な使用方法について解説していきます。ここではenumファイルは次のように記述しているものとします。

<?php declare(strict_types=1);

namespace App\Enums;

use BenSampo\Enum\Enum;

final class UserType extends Enum
{
    const Disabled = 0;
    const Administrator = 1;
    const Member = 2;
    const Guest = 3;
}

すでにお気づきかと思いますが、クラス内のconstではキーと値を指定しています。例えばキーAdministratorでは値1を設定しています。このキーと値がenumを使用する際に重要となります。

キーから値の取得

以下のように記述すると指定したキーの値が出力されます。

構文

Enumクラス名::キー

例えばキーMemberの値を取得したい場合は以下のように記述します。

UserType::Member
// 2が返る

キーを配列で取得する:getKeys()

キーを配列で取得したい場合はgetKeys()メソッドを使用します。例えば引数になにも指定せずにgetKeys()を使用するとすべてのキーが配列で返されます。

UserType::getKeys();
// ['Disabled', 'Administrator', 'Member', 'Guest']

引数にキーの値を指定することで指定した値のキーの配列を返します。

UserType::getKeys(UserType::Member);
// ['Member']

キーを取得する:getKey()

キーを取得したい場合はgetKey()メソッドを使用します。引数に値を指定することで、それと対応するキーが返されます。返り値の型はstring型です。

UserType::getKey(0);
// 'Disabled'が返される

UserType::getKey(UserType::Member);
// 'Member'が返される

値を配列で取得する:getValues()

値を配列で取得したい場合はgetValues()メソッドを使用します。例えば引数になにも指定せずにgetValues()を使用するとすべての値が配列で返されます。

UserType::getValues();
// [0, 1, 2, 3]

引数にキーを指定することで、それに対応する値が返されます。

UserType::getValues('Guest');
// [3]

キーが存在するか判定:hasKey()

特定のキーが含まれているか判定したい場合はhasKey()メソッドを使用します。キーが存在する場合は「True」、存在しない場合は「False」を返します。

UserType::hasKey('Administrator');
// 'True'

値からキーを取得する(オーバーライド可能):getDescription()

値からキーを取得するメソッドとしてgetDescription()メソッドが用意されています。このメソッドはオーバーライドして返す文字列を変更することができます。

getDescription()メソッドの引数には値を指定し、それに対応するキーが返されます。

UserType::getDescription(3);
// 'Guest'
UserType::getDescription(UserType::Administrator);
// 'Administrator'