【发布时间】:2020-03-30 12:22:24
【问题描述】:
我有一个 API 可以发送一组人员,一些是需要更新的现有对象,一些是需要创建的新对象,它们都需要验证,其中一部分是测试一个唯一的电子邮件。我正在使用 FormRequest:
$rules = [
'staff.*.name' => 'required|max:128',
'staff.*.email' => 'required|email|unique:users',
'staff.*.description' => 'max:512',
];
所以问题是,我相信您可以看到,电子邮件地址在更新时无法通过唯一验证。这是因为如果 ID 与正在验证的项目相同,则忽略电子邮件的机制会导致我出现问题。
我看不到获取当前正在验证的对象 ID 的方法,因此我可以访问其 ID。所以我不能添加部分:
'staff.*.email' => 'required|email|unique:users,email,id,' . $currentStaff->id
我对这个特定问题看不到太多,所以我假设我这样做是在找错树,或者错过了一些非常明显的东西。
下面的payload:
{
"staff": [
{
"name":"Libbie Turcotte",
"email":"carolyn16@example.net",
"updated_at":"2019-12-05 19:28:59",
"created_at":"2019-12-05 19:28:59",
"id":53
},
{
"name":"Person Dave",
"email":"dave@email.com",
},
{
"name":"Staff Name",
"email":"staff@email.com",
}
]
}
【问题讨论】:
-
这是可行的,但需要一些自定义逻辑,特别是在
staff[]输入数组中的某处包含ID,可以是staff[id]或staff[][id]。并且规则需要根据输入来构建,所以你可以循环它并引用:foreach($request->input('staff') AS $staff){ ... // use $staff['id'] },或foreach($request->input('staff') AS $id => $staff){ ... // use $id }。如果您可以显示发送staff输入的表单/ajax 请求,那将有所帮助。 -
我明白你在说什么。员工 json 相当简单,我会更新我的问题以包含它。
-
感谢您提供!下面的答案实际上正是在展示我所解释的内容;根据输入构建规则,可以看到
1和2与3有不同的唯一规则,因为id的包含/省略。 -
是的,现在只是实施该解决方案。说得通。感谢您在这方面的帮助。
-
phpunit tests/Feature/API/StaffTest.php --filter testAddAndUpdateStaff PHPUnit 8.4.3,作者 Sebastian Bergmann 和贡献者。 . 1 / 1 (100%)
标签: arrays laravel validation unique