Laravel中如何验证数组键对应的ID是否存在于数据库?
验证以ID为键的数组的键合法性
场景说明
你需要验证一个以ID为键的数组,示例结构如下:
array:1 [ "data" => array:3 [ 13 => array:1 [ "price" => 100 ] 14 => array:1 [ "price" => 200 ] 46 => array:1 [ "price" => 300 ] ] ]
其中13、14、46是需要验证的ID键。你已经完成了data数组和price字段的基础验证:
$request->validate([ 'data' => ['required', 'array', 'min:1'], 'data.*.price' => ['required', 'numeric'], ]);
问题解答
直接使用'data.*' => ['exists:table,id']是不可行的,因为data.*指向的是data数组里的子数组值(比如["price" => 100]),而不是你要验证的数组键(即ID)。
要验证这些键的合法性,有两种实用方案:
方案一:自定义验证规则
创建自定义规则类来检查数组键是否存在于指定数据表中:
// 自定义规则类 class ValidDataKeys implements Rule { public function passes($attribute, $value) { $keys = array_keys($value); // 校验所有键是否都存在于目标表的id字段 return \DB::table('your_table')->whereIn('id', $keys)->count() === count($keys); } public function message() { return '数组中包含无效的ID键'; } } // 在验证中使用自定义规则 $request->validate([ 'data' => ['required', 'array', 'min:1', new ValidDataKeys], 'data.*.price' => ['required', 'numeric'], ]);
方案二:闭包结合数据库查询
通过闭包提取数组键,直接校验合法性并返回错误信息:
use Illuminate\Validation\Rule; $request->validate([ 'data' => [ 'required', 'array', 'min:1', function ($attribute, $value, $fail) { $keys = array_keys($value); // 获取数据库中存在的合法ID $validIds = \DB::table('your_table')->whereIn('id', $keys)->pluck('id')->toArray(); // 找出无效的键 $invalidKeys = array_diff($keys, $validIds); if (!empty($invalidKeys)) { $fail('无效的ID键:' . implode(', ', $invalidKeys)); } } ], 'data.*.price' => ['required', 'numeric'], ]);
内容的提问来源于stack exchange,提问作者mikelplhts
相关产品推荐
相关产品推荐

