Laravel : 不同字段的唯一验证

Laravel : Unique validation with different fields

我有一个 table states 并且字段是 id,country_id,state_code,state_name。现在我想验证同一个国家没有相同的 state_code 和相同的 state_name 在 table.

我试过了,但没用。

在我的控制器中:

    $validator = State::validator($request->all(), $id); 
    if ($validator->fails()) {
        return redirect()->back()
            ->withErrors($validator->getMessageBag())
            ->withInput($request->all());
    } 

这是我在模型中的验证函数:

protected function validator(array $data, $id)
{
    return Validator::make($data, [
        'country_id'               => 'required',
        'state_code'               => 'required',
        'state_name'               => 'required',
    ]);
}

如何在没有自定义验证的情况下解决这个问题?

首先,您的验证规则仅检查请求中是否存在这些字段。数据库中存在的值没有发生验证。首先,您可能想要查看 rule_exists 的文档。其次,您可能必须根据文档更新此规则的查询


use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::exists('staff')->where(function ($query) {
            $query->where('account_id', 1);
        }),
    ],
]);

这里可以传递额外的查询参数。

你不需要自定义验证,laravel 有一个独特的列验证

$this->validate($request, [
    'country_id' => 'required',
    'state_code' => 'required|unique:states,state_name',
    'state_name' => 'required|unique:states,state_code',
]);

通过这种方式,您可以确定 state_code 中的列值与 state_name 中的列值相比是唯一的,更多信息请查看 docs