Laravel唯一验证规则忽略数组输入数据

时间:2020-10-23 05:02:48

标签: laravel

'email' => 'required|unique:users,email,'.$user->id

我们都知道,当我们更新数据库中的实例时,如上例所示,当我们使用唯一的验证规则时,应忽略其ID。
现在在我的应用程序中,我有一个Agency模型和一个Employee模型,并且每个Agency都有很多Employee。
在我的应用程序中,我有一个用于创建和更新代理商和员工的表格。
通过此表单发送的数据:

$request->validate([
    'agency.name' => 'required|string',
    'agency.phone' => 'required|string|unique:agencies,phone,'.$agency->id,
    .
    .
    .
    'employees.*.first_name' => 'required|string',
    'employees.*.last_name' => 'required|string',
    'employees.*.email' => 'required|unique:employees,email'
]);

现在,验证agency.phone非常容易,因为我们只有1个代理商,我们可以轻松地通过$agency->id来忽略此实例的唯一验证规则。

'agency.phone' => 'required|string|unique:agencies,phone,'.$agency->id

现在我面临的问题是,我的传入数据中有多个员工,我不能使用id来忽略

'employees.*.email' => 'required|unique:employees,email' // cannot add $employee->id here in order to ignore while updating

我的传入数据中确实有每个员工的ID,那么如何像本例中那样使用它来忽略laravel数组传入数据的验证规则?

帮助
dd($request->all())的输出是:

array:2 [
  "agency" => array:7 [
    "id" => 5
    "name" => "xxxxxxx"
    "manager_name" => null
    "manager_phone" => null
    "phone" => null
    "created_at" => "2020-10-23T00:53:13.000000Z"
    "updated_at" => "2020-10-23T00:53:13.000000Z"
  ]
  "employees" => array:1 [
    0 => array:6 [
      "id" => 1
      "first_name" => "John"
      "last_name" => "Doe"
      "email" => "doctor@doctor.com"
      "created_at" => "2020-10-23T00:53:13.000000Z"
      "updated_at" => "2020-10-23T00:53:13.000000Z"
    ]
  ]
]

1 个答案:

答案 0 :(得分:0)

只需验证两次! :)

您可以首先验证不需要您知道员工ID的所有内容。像这样:

<?php

$request->validate([
    'agency.name' => 'required|string',
    'agency.phone' => 'required|string|unique:agencies,phone,'.$agency->id,
    // ...
    'employees.*.first_name' => 'required|string',
    'employees.*.last_name' => 'required|string',
    'employees.*.email' => 'required'
]);

然后,您可以对员工ID进行foreach循环,并构造您唯一的电子邮件规则。假设您的员工ID位于变量$ids中,并且它们的排序方式与请求数据相同,则可以执行以下操作:

<?php

$uniqueEmailRules = [];
foreach($ids as $key => $id) {
    $uniqueEmailRules['employees.' . $key . '.email'] = 'unique:employees,email,' . $id;
}

$request->validate($uniqueEmailRules);