2017-08-26 77 views
1

我想验证用户在地址表单中选择了有效的状态值。为了简单起见,我不会让他们选择国家。自定义验证规则检查是否存在列名和过滤器

状态信息是表具有以下字段:

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因为我还没有能够找到其他地方的例子。

我该如何得到这个规则的工作?

+0

我认为Laravel将从数据索引承担列名称。在这种情况下,'address.state'。你有没有尝试显式传递列名? 'Rule :: exists('shop_address_states','id') - > where(...'注意参数是两个单独的字符串 – fubar

+0

@fubar啊 - 我想这可能是我错过的地方 - 我试过Rule: :exists('shop_address_states,id') - 让它成为一个答案,我可以尝试,当我可以在今天晚些时候 – HorusKol

+0

嗨那里..“address.state”的价值是什么?它是'id'还是'缩写'? – Demonyowh

回答

2

如果您未明确声明列名,则Laravel将假定数据索引中的列名。在这种情况下,address.state

当您尝试添加列名称时,您没有将它作为第二个参数传递给它自己的权利。尝试以下代替:

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

aha!在API中找到它:https://laravel.com/api/5.4/Illuminate/Validation/Rule.html#method_exists – HorusKol