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

Hor*_*Kol 2 validation laravel eloquent laravel-5.4

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

状态信息位于具有以下字段的表中:

id
country_id
abbreviation
name
Run Code Online (Sandbox Code Playgroud)

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

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

'address.state' => [
    'required',
    Rule::exists('shop_address_states')->where(function ($query) {
        $query->where('country_id', 1);
    }),
],
Run Code Online (Sandbox Code Playgroud)

但我得到一个Unknown column 'address.state'错误。

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

'address.state' => [
    'required',
    Rule::exists('shop_address_states,id')->where(function ($query) {
        $query->where('country_id', 1);
    }),
],
Run Code Online (Sandbox Code Playgroud)

我收到一个undefined offset: 1错误。

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

我如何让这个规则起作用?

fub*_*bar 5

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

当您尝试添加列名时,您并没有将它作为第二个参数传递给它自己。请尝试以下操作:

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