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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:35:24