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

时间:2020-02-21 16:29:45

标签: laravel

我在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成功完成了此操作。但是,当另一位员工登录并提交时,出现此错误:

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

请注意,这不存在。

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

我该如何解决?

谢谢。

1 个答案:

答案 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);
})
相关问题