Есть несколько вещей, которые вы можете сделать, чтобы ускорить это, повысить производительность и уменьшить количество обращений к базе данных / вызову функции.
Во-первых, вы можете вытащить все свои ToolTransactionInfo
сразу, прежде чем начать цикл. Это поможет вам сделать только одно извлечение БД. Итак, над вашей петлей:
$transactionInfosTotal = ToolTransactionInfo::get();
Это дает вам всю необходимую информацию. Затем, внутри вашего цикла, вы можете выполнить тот же запрос, но сделать это для коллекции, уже находящейся в памяти (т.е. не возвращаться в БД).
$transactionInfos = $transactionInfosTotal->where('tool_id', $tool->id)
->where('date', $date)
->get();
Таким образом, вы получаете ту же коллекцию внутри своих циклов для нужного дня и инструмента - и затем вы можете выполнять свои вычисления или перемещаться в массив по своему усмотрению. Это просто сохраняет попадания в БД / делает его более эффективным и быстрым.
Другая вещь, которую вы можете сделать, чтобы немного ускориться, это вызвать время (Carbon) один раз. Не огромная экономия, но, вероятно, будет немного быстрее. Перед вашими циклами установите «сейчас» в переменную:
$now = Carbon(now);
Затем используйте это значение, хранящееся в переменной внутри ваших циклов, для обработки ваших временных вычислений, поскольку теперь не нужно возвращаться к методу, чтобы получить его сейчас, оно уже хранится в памяти:
$date = $now->subDays($count)->format('Y-m-d');
НТН