1. ホーム
  2. php

Laravelでenumをどこに置くか/どう扱うか?

2023-09-23 20:09:39

質問

Laravelには a <select> フォームヘルパー で、これは入力として辞書を取ります。私は、これらすべての値を一カ所に集めておきたいと思っています。例えば、次のような列挙型があるとします。

$phoneTypes = [
    'CELL' => "Cellular",
    'HOME' => "Home",
    'WORK' => "Work",
];

これは、ビュー/テンプレートとデータベースの両方で使用したいものです。

Schema::create('customers', function (Blueprint $table) {
    $table->increments('id');
    $table->enum('pri_phone_type',array_keys($phoneTypes));
    ...
});

  1. これらを置くのに推奨される場所はありますか?
  2. すべてのビューで簡単にアクセスできるように、これらをグローバルにすることは可能ですか?

どのように解決するのですか?

???? アップデート:PHP8.1ではついにenumのネイティブサポートが実現しました! ????????

詳しくはこちらをご覧ください。

https://stitcher.io/blog/php-enums https://php.watch/versions/8.1/enums https://www.php.net/manual/en/language.enumerations.php

以下の私のオリジナルの回答はもう適用されませんが、もしあなたが古いバージョンのPHPで作業しているならば....


元の回答

enumを処理するためのいくつかのオプションがあります。しかし、いくつか見ていく前に、まず、私は強くあなたに ではなく を使用することを強くお勧めします。 enum のカラムタイプを使用します。

データベースの列挙型は、多くの理由で問題があります。例えばこの記事を読むことをお勧めします。

http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

それでは、他の選択肢をいくつか見てみましょう。

Laravelのコンフィグを使用する

Laravelを使用しているので、非常にシンプルなオプションの1つは、設定ファイルにオプションの配列を貼り付けることです。

新しいファイルを作成するとします。 config/enums.php を以下のように作成します。

return [
    'phone_types' => [
        'CELL' => "Cellular",
        'HOME' => "Home",
        'WORK' => "Work",
    ]
];

これで config('enums.phone_types') にアクセスできるようになりました。

PHP パッケージを使用する

@Banfordの回答は、クラス定数で基本的な列挙型の振る舞いをする方法を示しています。もしそのアプローチが好きなら、この記事と、このコンセプトに基づいて強く型付けされた列挙型を提供するパッケージを見ることをお勧めします。

https://stitcher.io/blog/php-enums

https://github.com/spatie/enum

このようなクラスを作成することになります。

/**
 * @method static self cell()
 * @method static self home()
 * @method static self work()
 */
class PhoneTypes extends Enum
{
}

そして、今度は PhoneTypes::home() をアプリ内で呼び出すことができます。必要であれば、そのパッケージのドキュメントをチェックして、値のマップを作成する方法を確認してください。

DBのリレーションシップを利用する

もし、あなたが 本当に オプションをデータベースで管理したいのであれば、私なら別の phone_types データベーステーブルを作成し customers テーブルとの関係を作成します。これは やはり を使うよりもずっと良い選択肢です。 enum カラムタイプを使用するよりも良い選択肢です。