Laravel选项列表验证问题:校验值是否存在于数据库列中
问题描述
我的前端有一个选项列表,数据来自数据库的countries表的nicename列。我想要阻止用户提交该列中不存在的值,目前已编写了自定义验证逻辑(代码如下),虽然能正常工作,但看起来不够专业。我曾看到可以用in:table_name,column_name的简短方式实现该验证,但尝试后无效,想请教正确的实现方式?
$rules = [ 'shop_country' => [ 'required', function ($attribute, $value, $fail ) { $found_country = ''; $countries = Country::get()->toArray(); foreach ($countries as $country) { if ($country['nicename'] === $value) { $found_country= $country['nicename']; } } if($found_country === ''){ $fail('The country is not valid!'); } }], ]
正确实现方式
你混淆了验证规则的用法:Laravel中用于验证字段值是否存在于数据库指定表列的规则是**exists:table,column**,而非in。in规则仅适用于固定值列表的校验(比如in:US,CA,GB),无法直接关联数据库查询。
直接用exists规则替换自定义闭包即可,代码更简洁高效:
$rules = [ 'shop_country' => [ 'required', 'exists:countries,nicename' ], ];
额外优化建议
- 自定义错误提示:如果需要替换默认错误文案,可在验证消息中配置:
$messages = [ 'shop_country.exists' => '所选国家无效,请选择列表中的选项', ]; // 验证时传入自定义消息 $validator = Validator::make($request->all(), $rules, $messages);
- 性能提升:原代码会查询全表并循环判断,而
exists规则仅执行一条SELECT EXISTS(...)的轻量SQL查询,在国家数据较多时性能优势明显。
内容的提问来源于stack exchange,提问作者Orkhan Orkhan
相关产品推荐
相关产品推荐

