基于两个字段的唯一表单验证

unique form validation based on two fields

我正在为名为 services 的 table 创建一条新记录,包括数据库中的一些字段(namedepartment_iddescription)。我需要将两个字段对组合在一起(namedepartment_id)。我如何验证它以创建和更新函数?

在服务请求中:

return [
          'params.name' => 'required|unique:services,name and depatment_id',
       ];

在服务模型中:

public function department()
{
    return $this->belongsTo(Department::class);
}

在部门模型中:

public function services()
{
    return $this->hasMany(Service::class);
}

在路线中:

Route::apiResource('/services', ServiceController::class)->names([
    'store' => 'services_store',
    'update' => 'services_update',
]);

例如:

某部门有服务时报错! 如果有name = service1department_id = 1的记录,用户不能再次创建namedepartment_id的相同记录组合!用户允许使用 (name = service1department_id = another_number) 或 (department_id = 1name = another_name) 创建服务,但使用 (name = service1department_id = 1) 不允许

您可以这样使用 unique 规则:

return [
    'params.name' => [
        'required', 
        Rule::unique('services', 'name')
            ->ignore($this->service)
            ->where('department_id', $this->input('params.department_id'))
     ],
];

在这里你告诉 Laravel 检查 services table 中是否没有现有记录 $this->input('params.name') 作为 name$this->input('params.department_id') 作为 department_id.

这里的 ->ignore($this->service) 是为了确保我们忽略当前服务(如果我们正在更新),所以它不会在验证期间“找到自己”。

$this->service 将是您正在更新的当前实例(如果您正确设置了路由和控制器,这是另一个主题)。