如何在Laravel查询构造器中正确使用PHP 8枚举类型?
在Laravel查询构造器中使用PHP 8枚举的正确方式
你定义的PHP 8字符串枚举如下:
enum OperationTypes: string { case PointsAdd = 'points-add'; }
针对你提出的两种写法,结论是两种都能正常工作,但直接传入枚举实例的写法更符合最佳实践,具体说明如下:
单条件查询(where)
- 写法1:
Model::where('type', OperationTypes::PointsAdd)
Laravel 9及以上版本会自动识别枚举类型,将其转换为对应的value值(也就是'points-add')拼入查询语句。这种写法更类型安全,能避免手动拼写字符串时出现的笔误,后续枚举定义变更时也能自动同步。 - 写法2:
Model::where('type', OperationTypes::PointsAdd->value)
直接获取枚举的字符串值传入查询,也能得到正确结果,但缺少类型检查的保障,如果枚举的value有修改,手动取value的地方可能会遗漏更新。
多条件查询(whereIn)
- 写法1:
Model::whereIn('type', [OperationTypes::PointsAdd])
和where逻辑一致,Laravel会自动把数组中的枚举实例转换为对应的value,同样具备类型安全的优势。 - 写法2:
Model::whereIn('type', [OperationTypes::PointsAdd->value])
同样可行,但同样缺少类型检查的防护。
注意:如果你的Laravel版本低于9.x,框架不支持自动转换枚举实例,此时必须手动通过
->value获取枚举值传入查询,否则会触发错误。
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

