如何在请求验证时校验参数是否匹配数据库enum值及数据表可用值
提交参数校验实现方案
尺码枚举值校验
针对tamanho枚举类型字段的校验,有两种常用实现方式:
方式一:硬编码枚举值(开发成本最低,适合枚举值固定不变的场景)
直接使用框架自带的in验证规则,把数据库中tamanho字段的所有允许枚举值列在规则中即可,修改后的验证代码如下:
return [ // 取值对应你数据库tamanho字段的所有enum选项,可根据实际枚举值调整 'tam' => 'required|in:P,M,G,GG', // 可用exists规则校验颜色是否在数据表存储的可用颜色范围内,替换为你实际的表名字段名 'color' => 'required|exists:product_table,color', 'quantity' => 'required|numeric|min:1|max:20', ];
方式二:动态读取数据库枚举值(适合枚举值可能迭代调整的场景)
如果不想硬编码枚举值,避免后续修改数据库枚举值还要同步改验证代码,可以先写辅助方法动态拉取数据库对应字段的枚举取值:
// 辅助方法:获取指定表指定字段的enum取值列表 function getEnumOptions(string $table, string $column): array { $columnInfo = \DB::select(\DB::raw("SHOW COLUMNS FROM {$table} WHERE Field = ?"), [$column])[0]; preg_match("/^enum\('(.*)'\)$/", $columnInfo->Type, $matches); return explode("','", $matches[1]); }
然后在验证规则中动态传入允许的取值列表即可:
$allowedSizes = getEnumOptions('你的商品表名', 'tamanho'); return [ 'tam' => ['required', \Illuminate\Validation\Rule::in($allowedSizes)], 'color' => 'required|exists:你的商品表名,color', 'quantity' => 'required|numeric|min:1|max:20', ];
补充优化
如果不同T恤商品对应各自的可用尺码、颜色范围,还可以在验证规则中加入商品ID的条件限制,避免用户提交当前商品不支持的参数:
return [ 'product_id' => 'required|exists:products,id', 'tam' => [ 'required', \Illuminate\Validation\Rule::in($allowedSizes)->where('product_id', request('product_id')) ], 'color' => [ 'required', \Illuminate\Validation\Rule::exists('product_colors', 'color_code')->where('product_id', request('product_id')) ], 'quantity' => 'required|numeric|min:1|max:20', ];
内容的提问来源于stack exchange,提问作者Gonçalo Bastos
相关产品推荐
相关产品推荐

