Laravel-如何解决规则请求验证错误

Laravel-如何解决规则请求验证错误,laravel,Laravel,我在Laravel-5.8中有一个项目,它验证了: 目标\类型\ id、考核\标识\ id、员工\ id在使用规则请求的考核\目标中唯一 目标\类型\ id、评估\身份\ id、员工\ id是外键 模型 存储算法需求 public function rules() { return [ 'goal_type_id' => [ 'required', Rule::unique('apprais

我在Laravel-5.8中有一个项目,它验证了:

目标\类型\ id、考核\标识\ id、员工\ id在使用规则请求的考核\目标中唯一

目标\类型\ id、评估\身份\ id、员工\ id是外键

模型

存储算法需求

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');
    }
}
在“评估目标”表中,员工只能有一个与评估标识和员工标识相关的目标类型标识

员工a成功地做到了这一点。但当另一名员工登录并提交时,我出现以下错误:

目标类型已存在。请输入唯一的目标类型

请注意,这并不存在

如规则验证自定义消息所示:

我如何解决这个问题

谢谢。

规则::unique()
将仅应用于
'goal\u type\u id'
,但引用的是一个唯一列数组

如果希望确保它们在各自的表中是唯一的值,请执行以下操作:

public function rules()
{
    return [
        'goal_type_id' => 'required|unique:goal_types,id',
        'employee_id' => 'required|unique:employees,id',
        ...
    ];
}

复合密钥验证

您需要的是复合密钥的验证(即,它们在组合中是唯一的)。这可以通过使用
where
约束来实现

'goal_type_id' => Rule::unique('goal_types')->where(function ($query) {
    return $query
        ->where('employee_id', 1)
        ->where('appraisal_identity_id', 1);
})

你好像不明白。这三个字段就目标类型id而言是唯一的。也就是说,当输入目标类型id时,应用程序必须根据评估目标表中的评估标识id和员工id进行检查。正如我当时怀疑的那样,您希望检查复合键是否唯一。你对
目标类型\u id
的规则让我有点吃惊。我已经更新了我的答案,但我还没有机会测试它,但它应该为你指明了正确的方向!我现在如何进行更新。”目标\类型\ id'=>[“必需”,规则::唯一('评估\目标','目标\类型\ id','评估\身份\ id','员工\ id')->忽略($this->评估\目标)],
'goal_type_id' => Rule::unique('goal_types')->where(function ($query) {
    return $query
        ->where('employee_id', 1)
        ->where('appraisal_identity_id', 1);
})