You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel表单请求验证:避免员工与日期组合重复录入

解决Laravel Form Request的联合唯一验证问题

你可以直接在验证层面实现staff_id与date组合唯一的需求,只需修改unique验证规则的写法,添加额外字段约束即可。

修改验证规则

当前你的date字段仅单独校验唯一性,导致同一日期下所有员工都无法提交。需要调整为校验staff_id和date的组合是否已存在:

use Illuminate\Validation\Rule;

public function rules()
{
    return [
        'staff_id' => ['required', 'integer', 'exists:staffs,id'],
        'date' => [
            'required',
            'string',
            Rule::unique('worktime')->where(function ($query) {
                return $query->where('staff_id', $this->input('staff_id'));
            })
        ],
        'time_started' => ['required', 'date_format:H:i'],
        'time_ended' => ['required', 'date_format:H:i', 'after:time_started'],
    ];
}

规则说明

  • 使用Rule::unique()的闭包形式,给唯一性校验添加额外的where条件:限定当前提交的staff_id与date的组合在worktime表中不存在。
  • 该写法会自动读取请求中的staff_id参数,确保只有同一员工在同一日期的重复提交才会被拦截。

自定义错误消息(可选)

默认错误消息仅针对date字段提示“已被占用”,你可以在Form Request中添加messages()方法,让提示更精准:

public function messages()
{
    return [
        'date.unique' => '该员工此日期的工时记录已存在,请勿重复提交',
    ];
}

简洁写法替代

如果不需要复杂查询逻辑,也可以用字符串形式的联合唯一规则:

'date' => ['required', 'string', 'unique:worktime,date,NULL,id,staff_id,' . $this->staff_id]

内容的提问来源于stack exchange,提问作者Le Marc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:36:20