【问题标题】:Laravel - How to resolve Rule Request Validation ErrorLaravel - 如何解决规则请求验证错误
【发布时间】:2020-06-06 03:02:56
【问题描述】:

我在 Laravel-5.8 中有这个项目可以验证:

goal_type_id、appearance_identity_id、employee_id 在使用规则请求的appearance_goals 中是唯一的。

goal_type_id、appearance_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');
    }
}

一个员工在评估目标表中只能有一个与评估身份ID和雇员ID相关的goal_type_id。

员工 a 成功地做到了这一点。但是当另一个员工登录并提交时,我得到了这个错误:

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

注意这不存在。

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

我该如何解决这个问题?

谢谢。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    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);
    })
    

    【讨论】:

    • 这就像你不明白。这三个字段相对于goal_type_id 是唯一的。也就是说,当输入了一个goal_type_id 时,应用程序必须检查它与appearance_goals 表中的appearance_identity_id 和employee_id 的关系
    • 正如我当时所怀疑的那样,您想要检查复合键是否唯一。你对goal_type_id 的规定让我有点震惊。
    • 我已经更新了我的答案,但我还没有机会测试它,但它应该会为你指明正确的方向!
    • 我现在如何进行更新。 'goal_type_id' => ['required', Rule::unique('appraisal_goals', 'goal_type_id', 'appraisal_identity_id', 'employee_id')->ignore($this->appraisal_goal) ],
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2017-07-16
    • 2019-10-09
    • 2020-07-17
    • 2020-07-17
    • 2017-06-13
    • 2018-05-18
    相关资源
    最近更新 更多