我在Laravel-5.8中有一个项目可以验证:
goal_type_id,appraisal_identity_id,employee_id在“评估要求”中使用规则请求是唯一的。
goal_type_id,appraisal_identity_id,employee_id是外键
型号
protected $fillable = [
'id',
'goal_type_id',
'appraisal_identity_id',
'employee_id',
'company_id',
];
StoreAppraisalGoalReques
public function rules()
{
return [
'goal_type_id' => [
'required',
Rule::unique('appraisal_goals', 'goal_type_id', 'appraisal_identity_id', 'employee_id')
],
];
}
public function messages()
{
return [
'goal_type_id.required' => 'Please enter the Goal Type!',
'goal_type_id.unique' => 'Goal Type already exists. Please enter a unique Goal Type.!',
];
}
控制器
public function store(StoreAppraisalGoalRequest $request)
{
$userCompany = Auth::user()->company_id;
$employeeId = Auth::user()->employee_id;
$identities = DB::table('appraisal_identity')->select('id','appraisal_name')->where('company_id', $userCompany)->where('is_current', 1)->first();
try {
$goal = new AppraisalGoal();
$goal->goal_type_id = $request->goal_type_id;
$goal->appraisal_identity_id = $request->appraisal_identity_id;
$goal->employee_id = $employeeId;
$goal->is_active = 1;
$goal->save();
foreach ( $request->activity as $key => $activity){
$goaldetail = new AppraisalGoalDetail();
$goaldetail->kpi_description = $request->kpi_description[$key];
$goaldetail->appraisal_doc = $request->application_doc[$key];
$goaldetail->activity = $request->activity[$key];
$goaldetail->start_date = $startDate ->toDateTimeString();
$goaldetail->end_date = $endDate->toDateTimeString();
$goaldetail->save();
}
Session::flash('success', 'Appraisal Goal is created successfully');
return redirect()->route('appraisal.appraisal_goals.index');
} catch (Exception $exception) {
Session::flash('danger', 'Appraisal Goal creation failed!');
return redirect()->route('appraisal.appraisal_goals.index');
}
}
员工的评比表中只能有一个与appraisal_identity_id和employee_id相关的Goal_type_id。
员工a成功完成了此操作。但是,当另一位员工登录并提交时,出现此错误:
目标类型已存在。请输入唯一的目标类型。
请注意,这不存在。
如规则验证自定义消息中所示:
我该如何解决?
谢谢。
答案 0 :(得分:0)
Rule::unique()
仅适用于'goal_type_id'
,但引用的是您唯一列的数组。
如果要确保它们在各自的表中是唯一值,请执行以下操作:
public function rules()
{
return [
'goal_type_id' => 'required|unique:goal_types,id',
'employee_id' => 'required|unique:employees,id',
...
];
}
复合密钥验证 laravel Docs
您要寻找的是组合键的验证(即,它们在组合中是唯一的)。这可以使用where
约束
'goal_type_id' => Rule::unique('goal_types')->where(function ($query) {
return $query
->where('employee_id', 1)
->where('appraisal_identity_id', 1);
})