You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在请求验证时校验参数是否匹配数据库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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:21:03