Одной функцией из БД выбираются модели $departments (отделы) вместе с их сотрудниками $department->users ( через один ко многим)
вместе с нормочасами сотрудников user->tracked_hours (тоже один ко многим)
Из этой коллекции моделей нужно получить два списка сотрудников:
- те, кто за прошлую неделю выработал меньше нормы
- те, кто выработал меньше по определенной причине (был в отгуле, в отпуске и тд)
1) Можно написать функцию ,которая пройдет по коллекции и вернет массив с двумя списками
return [
'bad_users' => []
'good_users' => []
]
Один элемент в каждом списке выглядит как то так:
[
'user' => 'Вася',
'tracked_hours' => число выработанных часов',
'hours_minimum' => минимум часов которые нужно вырабатывать,
'percent_of_minimum' => сколько часов не хватило до нормы в процентах,
'hours_diff_from_minimum' => сколько часов не хватило до нормы
]
Для второго списка еще добавляется массив отгулов и отпусков, из-за которых не была набрана норма
Довольно много вычислений на одну итерацию
Плюсы :
- за один проход по коллекции получаем все нужные данные , меньше нагрузки
Минусы:
- не особо переиспользуемо, т.к. всегда возвращаются два списка, а может нужен один
- возвращение сложного массива - нужно еще код почитать, чтобы понять, что возвращается (либо написать комментарий)
2) Написать две Функции, которые будут возвращать разные списки
Минусы - в два раза медленнее, на одну и ту же коллекцию по две итерации тяжелых вычислений
Плюсы - более читаемо, переиспользуемо
3) сделать одну функцию, которая в зависимости от флага будет возвращать один или два списка
Плюсы - быстро, минусы - еще более нечитаемо, куча ср.ных ифов
Каждый из вариантов мне кажется г.внокодом, но к сожалению, на ум не приходит ничего другого, а очень хотелось бы совета, как можно сделать все по нормальному, как сделали бы Вы