$query
->innerJoin('histories' , 'users.id = histories.user_id')
->select('users.*, histories.user_id, avg(timestampdiff(minute,`histories`.`time_in`,`histories`.`time_out`)) as avgtime')
->groupBy('user_id')
->having('avgtime > ' . $this->wash_middle_time_more);
const re = /(.+)\[(.+)\]\[(.+)\]/;
const formData = new FormData(drawingForm);
const result = {};
for (const [key, value] of Object.entries(formData)) {
const matches = key.match(re);
if (!matches) { continue }
const [, k1, k2, k3] = matches;
((result[k1] ??= {})[k2] ??= {})[k3] = value;
}
console.log(result); // тут валидация
В случае, если оба операнда являются строками, содержащими числа или один операнд является числом, а другой - строкой, содержащей числа, то сравнение выполняется численно
['id'=> ..., 'name' => ..., 'timestamp'=> ...,]
//определяем протокол - HTTP/HTTPS
$proto = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')? 'https': 'http';
//шлем заголовок для "обновления" страницы без пересылки формы.
//все последующие "ручные" обновления страницы будут происходить без отправки формы
header('Location: ' . $proto . '://' . $_SERVER['HTTP_HOST'] . '/' . $_SERVER['REQUEST_URI']);
exit;