使用列名和过滤器检查存在的自定义验证规则

Posted

技术标签:

【中文标题】使用列名和过滤器检查存在的自定义验证规则【英文标题】:Custom validation rule checking existence with column name and filter 【发布时间】:2018-02-04 04:54:30 【问题描述】:

我想验证用户是否在地址表单中选择了有效的状态值。在开发过程中为了简单起见,我还没有让他们选择国家/地区。

状态信息在一个包含以下字段的表中:

id
country_id
abbreviation
name

表单使用名称为 address[state] 的选择元素,并将状态 ID 作为选定值发送。

我第一次尝试验证规则是:

'address.state' => [
    'required',
    Rule::exists('shop_address_states')->where(function ($query) 
        $query->where('country_id', 1);
    ),
],

但我收到 Unknown column 'address.state' 错误。

当我尝试让它使用 ID 列时:

'address.state' => [
    'required',
    Rule::exists('shop_address_states,id')->where(function ($query) 
        $query->where('country_id', 1);
    ),
],

我收到 undefined offset: 1 错误。

我想我是在将规则 'state' => 'exists:states,abbreviation' 与 https://laravel.com/docs/5.4/validation#rule-exists 混为一谈,因为我无法在其他地方找到示例。

如何让这条规则生效?

【问题讨论】:

我认为 Laravel 将假定数据索引中的列名。在这种情况下,address.state。您是否尝试过显式传递列名? Rule::exists('shop_address_states', 'id')->where(... 注意参数是两个单独的字符串。 @fubar 啊 - 我想这可能是我走错的地方 - 我试过 Rule::exists('shop_address_states,id') - 让它成为答案,我会试一试今天晚些时候我可以的时候 您好 .. address.state 的值是多少?是id 还是abbreviation @Demonowh id 【参考方案1】:

Laravel 将假设数据索引中的列名,如果你没有明确声明列名。在这种情况下,address.state

当您尝试添加列名时,您并没有将其作为第二个参数传递。请尝试以下方法:

Rule::exists('shop_address_states', 'id')->where(function ($query) 
    $query->where('country_id', 1);
);

【讨论】:

啊哈!在 API 中找到它:laravel.com/api/5.4/Illuminate/Validation/…

以上是关于使用列名和过滤器检查存在的自定义验证规则的主要内容,如果未能解决你的问题,请参考以下文章

验证输入的自定义规则不包含坏词

Jquery Validate 默认校验规则及常用的自定义验证规则

使用带有附加参数的自定义规则验证 Laravel 中的数组

是否可以在没有 tfs 服务器的情况下验证 vs2010 中的自定义代码/架构规则?

Laravel 中正则表达式规则的自定义验证消息?

如何根据 Angular 2 中的自定义验证规则显示错误消息?