Laravel唯一验证优化:需忽略不同用户的重复技能校验
解决Laravel中同一学生不能重复添加技能的联合唯一验证问题
你当前的unique:stu_resume_skills规则是全局校验skill_id的唯一性,导致不同用户也无法添加同一个技能,这不符合需求。正确的做法是设置联合唯一验证,同时校验user_id和skill_id的组合唯一性。
修正后的验证规则(两种写法)
1. 字符串格式(简洁写法)
request()->validate([ 'skill_id' => 'required|exists:jobs_masterskills,id|unique:stu_resume_skills,skill_id,NULL,id,user_id,'.Auth::user()->id, ]);
exists:jobs_masterskills,id:确保用户选择的技能存在于技能主表中(替换你原来的skill_id自定义规则,若你的规则是其他用途可保留)unique规则参数解析:表名stu_resume_skills→ 验证字段skill_id→ 忽略ID(填NULL) → 忽略字段id→ 额外条件user_id等于当前登录用户ID
2. 数组格式(可读性更强)
这种写法需要先引入Rule类,在控制器顶部添加:
use Illuminate\Validation\Rule;
然后修改验证规则:
request()->validate([ 'skill_id' => [ 'required', 'exists:jobs_masterskills,id', Rule::unique('stu_resume_skills')->where(function ($query) { return $query->where('user_id', Auth::user()->id); }), ], ]);
完整修正后的控制器代码
use Illuminate\Support\Facades\Auth; use Illuminate\Validation\Rule; use App\Models\StudentSkillsModel; public function SkillsAddFormValue(Request $request) { request()->validate([ 'skill_id' => [ 'required', 'exists:jobs_masterskills,id', Rule::unique('stu_resume_skills')->where(function ($query) { return $query->where('user_id', Auth::user()->id); }), ], 'expertise_level' => 'required', // 可根据需求添加该字段的验证规则 ]); $save = new StudentSkillsModel; $save->user_id = Auth::user()->id; $save->skill_id = $request->skill_id; $save->expertise_level = $request->expertise_level; $save->save(); return redirect('student/academics/resume/skills/skills-list'); }
设置完成后,系统只会检查当前登录用户是否已添加过该技能,不同用户之间添加同一技能不会受限制。
内容的提问来源于stack exchange,提问作者Mohan Palanisamy
相关产品推荐
相关产品推荐

