Проверка Laravel уникальный сбой при обновлении для массива объекта
У меня есть API, который отправляет массив сотрудников, некоторые из них-существующие объекты, которые нужно обновить, а некоторые-новые объекты, которые нужно создать, все они должны быть проверены и в рамках этого тестирования для уникального электронного письма. Я использую FormRequest:
$rules = [
'staff.*.name' => 'required|max:128',
'staff.*.email' => 'required|email|unique:users',
'staff.*.description' => 'max:512',
];
Таким образом, проблема заключается в том, что, как я уверен, вы можете видеть, адрес электронной почты не проходит уникальную проверку при обновлении. Это связано с тем, что механизм игнорирования электронной почты, если идентификатор совпадает с проверяемым элементом, вызывает у меня проблему.
Я не вижу способа получить идентификатор объекта, который в настоящее время проверяется, чтобы я мог получить доступ к его идентификатору. Поэтому я не могу добавить часть:
'staff.*.email' => 'required|email|unique:users,email,id,' . $currentStaff->id
Я не вижу много об этой конкретной проблеме, поэтому я предполагаю, что я лаю на неправильное дерево, делая это таким образом или упуская что-то безумно очевидное.
Полезная нагрузка ниже:
{
"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",
}
]
}





Ответы - Проверка Laravel уникальный сбой при обновлении для массива объекта / Laravel validation unique failing on update for array of object

05.12.2019 06:41:38
Вы можете добавить правило foreach request staff element циклически проходя через массив и объединяя соответствующее правило:
$rules = [ // this ones are ok for all
'staff.*.name' => 'required|max:128',
'staff.*.description' => 'max:512',
];
// here loop through the staff array to add the ignore
foreach($request->staff as $key => $staff) {
if ( array_key_exists('id', $staff) && $staff['id'] ) { // if have an id, means an update, so add the id to ignore
$rules = array_merge($rules, ['staff.'.$key.'.email' => 'required|email|unique:users,id,'.$staff['id']]);
} else { // just check if the email it's not unique
$rules = array_merge($rules, ['staff.'.$key.'.email' => 'required|email|unique:users']);
}
}
Итак, для этого запроса
staff[1][id]=111
staff[1][email]=dd@ddd.dd
staff[2][id]=222
staff[2][email]=eee@eee.ee
staff[3][email]=fff@ffff
У вас будут такие правила:
[
"staff.*.name" => "required|max:128",
"staff.*.description" => "max:512",
"staff.1.email": "required|email|unique:users,id,111",
"staff.2.email": "required|email|unique:users,id,222",
"staff.3.email": "required|email|unique:users"
]

