php artisan make:enum コマンドは、Laravel内でEnumクラスを作成するコマンドです。
| アイテム | 理由 |
|---|---|
| PHP 8.1+ | PHP 8.1で導入されたネイティブ enum サポート |
| Laravel 11+ | php artisan make:enum は Laravel 11 以降に組み込まれたコマンド |
ディレクトリ app/Enums | 生成される enum はこのフォルダに置かれる(無ければ作成) |
| Eloquent モデル | enum 値を保存するテーブルのモデル |
| データベース列 | string, int, uuid など、enum のバック値に合わせた型 |
| 属性キャスティング | モデルで列を enum クラスにキャスト |
enum クラスの作成
# プロジェクトルートで実行
php artisan make:enum OrderStatus
プロンプトが表示されます。バック値の型に合わせて選択してください。
Select backing type:
1) Backed enum (int or string)
2) Pure enum (no backing value)
3) Flags enum
例: status カラムが文字列なら 1) Backed enum を選び、次に string と入力。
生成されたファイルは以下のようになります。
// app/Enums/OrderStatus.php
namespace App\Enums;
enum OrderStatus: string
{
case Pending = 'pending';
case Completed = 'completed';
case Cancelled = 'cancelled';
}
モデルへの追加
Order モデルが status カラムを持つ例です。
// app/Models/Order.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Enums\OrderStatus;
class Order extends Model
{
protected array $casts = [
'status' => OrderStatus::class,
];
}
コードでの利用例
| 操作 | コード例 |
|---|---|
| 現在のステータスを取得 | $order->status → OrderStatus インスタンス |
| ステータスの比較 | if ($order->status === OrderStatus::Completed) { … } |
| ステータスを設定 | $order->status = OrderStatus::Pending; $order->save(); |
| バック値を取得 | $order->status->value → 'pending' |
| 名前を取得 | $order->status->name → 'Pending' |
| 全ケースを列挙 | foreach (OrderStatus::cases() as $status) { … } |
マイグレーション例
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->string('status', 20); // string-backed enum
$table->timestamps();
});
データベースレベルで enum 値を制限したい場合(MySQL 8.0+ / PostgreSQL):
$table->string('status', 20)
->checkIn(['pending', 'completed', 'cancelled']);
よくある落とし穴と対策
| 問題 | 対策 |
|---|---|
| enum が保存されない | 列の型(string, int, uuid)が enum のバック値と一致しているか確認 |
| マイグレーションと enum が同期していない | enum を変更したら列を手動で修正または新しいマイグレーションを作成 |
| オートロードが効かない | enum ファイルを手動で追加したら composer dump-autoload を実行 |
Laravel 11 未満で make:enum を使えない | 旧バージョンなら spatie/laravel-enum などのパッケージを検討 |
フルワークフロー例
# 1. enum 作成
php artisan make:enum OrderStatus
// app/Models/Order.php
class Order extends Model
{
protected array $casts = [
'status' => OrderStatus::class,
];
}
// 2. オーダー作成
$order = Order::create([
'status' => OrderStatus::Pending,
]);
// 3. ステータス更新
$order->status = OrderStatus::Completed;
$order->save();
// 4. ステータスで検索
$completed = Order::where('status', OrderStatus::Completed)->get();
これで、Laravel 11+ の make:enum を使い、型安全かつ直感的に enum を扱えるようになります。

