Версия Laravel: 8 Версия PHP: 7.4 Необходимо определить возрастную категорию человека на основании возрастного диапазона который находится в другой таблице: Есть таблица 1 в которой содержаться данные о дате рождения, в таблице 2 содержаться: название возрастной категории, стартовый возраст категории, конечный возраст категории. Пытаюсь понять как сделать так что бы при получении данных из таблицы 1, рассчитать возраст человека, сравнить его с диапазоном возрастов из таблицы 2, и подставить название возрастной категории советующей возрасту человека в итоговую коллекцию.
Нет не урок, делаю сервис регистрации на соревнования. В итоговой таблице на сайте участников напротив каждого участника должна отображаться возрастная его возрастная категория. Пока только получаю данные из модели участников, формирую коллекцию и вывожу на сайт в виде таблицы. Читаю документацию, пытаюсь понять какой метод позволит добавить в итоговую коллекцию участников еще одно поле в котором будет определяться возрастная категория. Возможно более правильно будет сделать через отношение одной таблицы к другой, но так на сколько я понимаю придется руками выставлять возрастную категорию, а хотелось что бы автоматически возрастная категория определялась на основании возраста участника.
Подзапрос делать надо --- Добавлено --- Таблицы покажите --- Добавлено --- Или можно уже на PHP обработать и проверить, когда данные получены. Может даже лучше будет
Ну тут бы я скорее на пыхе потом проверил, наверное... В зависимости от задачи. Но на пыхе будет более ясный код. Для определения возраста удобно использовать сразу TIMESTAMPDIFF https://www.w3resource.com/mysql/date-and-time-functions/mysql-timestampdiff-function.php Код (Text): select participants.*, timestampdiff(years, now(), date_of_birth) as age, (select name from age_groups where timestampdiff(years, now(), date_of_birth) between age_start and age_finish) as age_group from partcipants Не отлаживал, естественно. На ларку сейчас переводить настроения нету, устал после спортзала.
Спасибо за ответ, запрос работает. Но походу данный способ не подойдет. Не сразу понял почему не работает, в сообщении об ошибке выводилось что подзапрос вернул больше одной строки. Потом дошло что у некоторых возраст попадает в разные диапазоны. Забыл сразу про это уточнить. Буду думать как это в контролере обработать силами php
А что надо делать, если возраст попадает в разные диапазоны? У SQL большой пулл возможностей на самом деле, можно и подкорректировать --- Добавлено --- От элементарного limit 1, до агрегирующих функций --- Добавлено --- Вот так, к примеру Код (Text): select participants.*, timestampdiff(years, now(), date_of_birth) as age, (select group_concat(name) from age_groups where timestampdiff(years, now(), date_of_birth) between age_start and age_finish) as age_groups from partcipants --- Добавлено --- https://www.w3resource.com/mysql/ag...egate-functions-and-grouping-group_concat.php
Точно не в представление. Из SQL и PHP сам бы выбирал, хотя обычно стараюсь, чтоб мне всё база вывела. В реальном проекте запрос бы переписал на Query Builder. Младшая категория - по age_start? Тогда Код (Text): select participants.*, timestampdiff(years, now(), date_of_birth) as age, (select name from age_groups where timestampdiff(years, now(), date_of_birth) between age_start and age_finish order by age_start limit 1) as age_group from partcipants
По идеи, в таком случае планировал выбирать категорию с наименьшим возрастом. Здесь видно что 16 лет попадает и в 15-17 и до 21 - надо выбрать 15-17, а 17,18,19,20 попадает до 21 и во Взрослые - надо выбрать до 21. Идея с конкатенацией хорошая и limit 1 тоже подойдет если будет выбираться младшая возрастная категория. В будущем думал в таком случае предлагать пользователю самому выбирать. Еще хотел уточнить, как будет правильнее, (так сказать с позиции наилучших практик), эту логику обрабатывать на уровне SQL или PHP, или вообще в представления ее запихнуть, и там уже может через VUE реализовывать ее. --- Добавлено --- С конкатенацией даже наверное лучше пока получается. В ячейке получается строка которую потом уже можно по любой логике разложить так как надо и выбрать уже нужный возраст в зависимости от настроек соревнований.
В принципе, именно php-программисты обычно отдают предпочтение SQL, java-программисты обычно любят сами ковыряться (по крайней мере те, с которыми мне доводилось работать). Но на самом деле, современные базы умеют очень-очень много
Спасибо за помощь, теперь буду думать как это правильно реализовать с моделями на ларавел, с моими знаниями надежды мало конечно, но если не получиться буду сырой запрос запихивать в обработчик.
Тут, наверное, надо с другой стороны смотреть. Например: - подходит ли кандидат для участия в виде соревнований, регламент которых ограничен определённой возрастной группой? - в турнирах для каких возрастных групп может принимать участие кандидат? - самая младшая возрастная группа, с которой кандидат может заниматься? - самая старшая возрастная группа, с которой кандидат может заниматься? То есть "не просто так" подбирать возрастную группу, исходя из конкретной задачи для решения которой эта группа требуется. --- Добавлено --- Вот тут, наверное, действительно нужен список, если спортсмен подходит в условия для нескольких категорий.
Согласен, все эти проверки будут нужны. Пока хотел на скорую руку сделать просто сбор заявок. В итоге сделал все с проверками внутри методов. Через SQL запросы не стал делать, кроме возраста ещё надо проверять весовую категорию, а она тоже зависит от возраста поэтому решил не строить сложных запросов.
Ну иногда сложные запросы спасают. Я на одном проекте недавно увеличил скорость ответа с 700 мс до 70мс просто перенеся логику в сложный запрос