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


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

我们都知道,当我们更新数据库中的实例时,当我们使用唯一验证规则时,我们应该忽略它的id,就像上面的例子一样
现在在我的应用程序中,我有一个Agency模型和一个Employee模型,每个Agency都有许多Employees
在我的应用程序中,我有一个创建和更新机构和员工的表格
此表单发送的数据:

$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非常容易,因为我们只有一个代理,并且我们可以很容易地传递$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验证规则,如本例所示?

HELP
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"
]
]
]

只需验证两次!:(

您可以首先验证所有不需要知道员工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);

为了避免两次验证,您可以执行以下操作:

$request->validate([
'employees.*.email' => Rule::forEach(function ($value, $attribute, $data) {
$idKey = Str::replace('email', 'id', $attribute);
return [
'email', 'required', Rule::unique('employees')->ignore($data[$idKey])
];
}),
]);

在回调中,$value会给你正在验证的电子邮件地址,$attribute会给你验证数组的密钥,例如employees.1.email,然后$data会给你该规则的所有验证条目。

最新更新