在 laravel 9 + php 8.1 中,对 backed enum 字段(如 `jprojectstatus::active`)执行 `rule::unique()->where()` 验证时,需显式提取其标量值(如 `->value`),这是当前最简洁、可靠且符合框架设计意图的标准做法。
在 Laravel 的验证规则中,Rule::unique() 的 ->where() 方法底层依赖字符串替换逻辑(如 str_replace),因此其第二个参数必须是标量类型(string 或 int),而不能直接传入 enum 实例。你遇到的 TypeError 正是因为 JProjectStatus::Active 是一个对象,而非字符串 'active'。
✅ 推荐写法(最佳实践):
use Illuminate\Validation\Rule;
validator($attributes, [
'manager_id' => [
'required',
'integer',
Rule::exists(User::getTableName(), 'id'),
Rule::unique(JProject::getTableName(), 'manager_id')
->where('status', JProjectStatus::Active->value), // ✅ 显式取 value
]
])->validate();⚠️ 注意事项:
// In JProjectStatus enum
public static function activeValue(): string
{
return self::Active->value;
}
// 使用:->where('status', JProjectStatus::activeValue())? 补充说明:Illuminate\Validation\Rules\Enum 是用于验证输入值是否为合法枚举成员(如表单提交的 state 字段是否等于 ActiveStatus::Draft),它与 unique()->where() 的场景完全不同——前者校验输入合法性,后者构建数据库查询条件,二者不可混用。

总结:显式调用 ->value 是 Laravel 处理 backed enum 与数据库交互时的标准、安全且推荐的方式,既保持类型清晰,又完全兼容框架底层机制。