Проверка Laravel уникальный сбой при обновлении для массива объекта

Проверка Laravel уникальный сбой при обновлении для массива объекта

05.12.2019 05:30:07 Просмотров 52 Источник

У меня есть 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",

    }
  ]
}
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59197360/laravel-validation-unique-failing-on-update-for-array-of-object#comment104621869_59197360
Я понимаю, о чем вы говорите. Персонал json довольно прост, я обновлю свой вопрос, чтобы включить его.
https://stackoverflow.com/questions/59197360/laravel-validation-unique-failing-on-update-for-array-of-object#comment104622648_59197360
Да, просто внедряю это решение сейчас. Обретать смысл. Спасибо за вашу помощь в этом.
https://stackoverflow.com/questions/59197360/laravel-validation-unique-failing-on-update-for-array-of-object#comment104623115_59197360
тестов PHPUnit/Характеристика/по API/StaffTest.РНР --фильтр testAddAndUpdateStaff помощью PHPUnit 8.4.3 Себастьян Бергманн и вкладчиков. . 1 / 1 (100%)

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

Является ответом!
porloscerros Ψ

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"
]
https://stackoverflow.com/questions/59197360/laravel-validation-unique-failing-on-update-for-array-of-object/59198620#comment104623185_59198620
спасибо, сработало обаяние! Незначительное изменение правила: $rules = array_merge($rules, ['staff.'.$ключевой.'.электронной почты' => 'требуется|по электронной почте|уникальность:пользователи,ИД' . $персонал['идентификатор']]);
https://stackoverflow.com/questions/59197360/laravel-validation-unique-failing-on-update-for-array-of-object/59198620#comment104623804_59198620
О! Спасибо за обратную связь, я пропустил это. Ответ обновлен ;-)
Закрыть X