自定义验证规则检查是否存在列名和过滤器

时间:2017-08-26 07:58:17

标签: laravel validation eloquent laravel-5.4

我想验证用户是否在地址表单中选择了有效的状态值。为了简化开发过程,我不会让他们选择这个国家。

状态信息位于包含以下字段的表中:

id
country_id
abbreviation
name

表单使用名为address[state]的select元素,并将状态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错误。

我想我有点抨击https://laravel.com/docs/5.4/validation#rule-exists中的'state' => 'exists:states,abbreviation'规则,因为我还没有在其他地方找到一个例子。

如何让此规则生效?

1 个答案:

答案 0 :(得分:3)

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

当您尝试添加列名时,您并未将其作为第二个参数传递给它自己的权利。请尝试以下方法:

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