Laravel Validator-> fail () Регулярное выражение с подстановочными знаками в именах полей [Объекты в массиве] - PullRequest
0 голосов
/ 22 декабря 2018

TL; DR: поиск регулярного или группового выражения для ключей в массиве.

subs.0.worker_id
subs.1.worker_id
subs.2.worker_id
...

Привет,

Я проверяю массив с рабочими объектами по уникальному правилу с подстановочными знаками:

'subs.*.worker_id'=>[
Rule::unique('teaching_units')->ignore($id,'teaching_unit_id')->where(function ($query) use ($date,$tu,$request,$subids) {
    return $query->where(
        [
            ['tu_date','=',$date],
            ['grid_unit_id','=',$tu['grid_unit_id']],
        ]
    )
        ->whereIn('worker_id',$subids)
        ->exists();
})
],

После этого я хочу создать отдельное сообщение для этого правила, проверив валидатор и его ошибки.Поэтому обычно я использую if (isset($failedRules['worker_id']['Unique'])), но это неправильно работает с подстановочными знаками.

foreach ($validator->errors()->toArray() as $error => $value) {
...
    $failedRules = $validator->failed();
    elseif (isset($failedRules['subs.*.worker_id']['Unique'])) {
            $timetablesWithDuplicateTeachingUnits = DB::table('teaching_units')
                ->whereNotIn('teaching_unit_id', [$tu['teaching_unit_id']])
                ->where(
                    [
                        ['tu_date','=',$date],
                        ['grid_unit_id','=',$tu['grid_unit_id']],
                    ]
                )
                ->whereIn('worker_id',$subids)
                ->join('timetables', 'teaching_units.timetable_id', '=', 'timetables.timetable_id')
                ->join('courses', 'timetables.course_id', '=', 'courses.course_id')
                ->join('locations', 'courses.location_id', '=', 'locations.location_id')
                ->get();

            $str = '';
            foreach ($timetablesWithDuplicateTeachingUnits as $item) {
                $str .= 'Im Kurs ' . $item->course_name . ' am Standort ' . $item->city . ' ist der Lehrer ' . $item->name . ' bereits für eine Stunde eingeteilt. ';
            }

            $errors->push([
                'arrayId' => $tu['arrayId'],
                //'field' => $error,
                'field' => 'subs',
                'msg' => $str,
            ]);
}
...

Я знаю, subs.*.worker_id не работает.Но это тот момент, когда я хочу получить.Так что я на самом деле ищу подстановочный знак / регулярное выражение в имени поля.

Заранее спасибо.

Искал preg_match, но не знаю, будет ли это работать с Laravels failRules.

...