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

Laravel中如何验证复选框提交数组的键是否为合法ID?

问题:Laravel如何验证数组的键是否为合法分类ID?

我有一批name属性为category[{{$category->id}}]的复选框,希望验证这些复选框对应的分类ID是否合法。我了解到可以通过以下方式验证数组:

$input = $request->validate([
    'category' => 'nullable|array',
    'category.*' => 'integer|min:1',
    'keywords' => 'nullable|string|min:1|max:2000'
]);

但我的需求是验证数组的键而非值,提交的输入数据JSON格式类似{"category": {"1": "on", "8": "on", ...}},我需要检查其中的1、8是否为合法分类ID,至少是整数。请问Laravel验证规则是否支持这种需求?若不支持我将提交功能请求。


解决方案

Laravel原生的验证规则不直接支持验证数组的键,但可以通过以下两种方式实现你的需求,无需提交新功能请求:

方法1:自定义验证规则

创建一个自定义规则来校验数组键的合法性:

  1. 生成自定义规则文件:
php artisan make:rule ValidCategoryKey
  1. 在app/Rules/ValidCategoryKey.php中编写校验逻辑:
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class ValidCategoryKey implements Rule
{
    public function passes($attribute, $value)
    {
        // 遍历数组所有键,检查是否为正整数
        foreach (array_keys($value) as $key) {
            if (!is_numeric($key) || intval($key) <= 0 || strval(intval($key)) !== $key) {
                return false;
            }
            // 可选:如果需要验证分类ID是否存在于数据库,添加以下代码
            // if (!\App\Models\Category::where('id', intval($key))->exists()) {
            //     return false;
            // }
        }
        return true;
    }

    public function message()
    {
        return '分类ID不合法,请选择有效的分类';
    }
}
  1. 在验证逻辑中使用该规则:
$input = $request->validate([
    'category' => 'nullable|array|'.new \App\Rules\ValidCategoryKey,
    'keywords' => 'nullable|string|min:1|max:2000'
]);

方法2:手动校验数组键

如果不想创建自定义规则,也可以在控制器中手动完成校验:

// 先做基础验证
$request->validate([
    'category' => 'nullable|array',
    'keywords' => 'nullable|string|min:1|max:2000'
]);

// 手动检查category数组的键
if ($request->has('category')) {
    foreach (array_keys($request->category) as $key) {
        // 验证是否为正整数
        if (!is_numeric($key) || intval($key) <= 0 || strval(intval($key)) !== $key) {
            return redirect()->back()->withErrors(['category' => '分类ID不合法']);
        }
        // 可选:验证分类ID是否存在于数据库
        // if (!\App\Models\Category::where('id', intval($key))->exists()) {
        //     return redirect()->back()->withErrors(['category' => '所选分类不存在']);
        // }
    }
}

内容的提问来源于stack exchange,提问作者inf3rno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:26:14