return Match::select('id', 'date')
->orderBy('date', 'asc')
->get()
->groupBy(function($val) {return Carbon::parse($val->date)->format('m-d');});
->groupBy(\DB::raw("RIGHT(LEFT(CONVERT_TZ(`date`, '+00:00', '+10:00'), 10), 5)");
SELECT
RIGHT(LEFT(CONVERT_TZ(`date`, '+00:00', '+10:00'), 10), 5) AS 'day',
CONCAT('[', GROUP_CONCAT(JSON_OBJECT('id', `id`, 'date', `date`)), ']') AS 'data'
FROM
`news`
GROUP BY
RIGHT(LEFT(CONVERT_TZ(`date`, '+00:00', '+10:00'), 10), 5)
это даже и близко не то, что хочет автор. Ему нужно выделить разные ключи, а вы делаете group by по СУБД, который к этому не имеет никакого отношения
Кроме того, если у вас есть нужда писать ТАКОЕ (три функции, пять параметров) - значит вы что-то делаете не так.
обоснуете- так что предлагаешь, писать свою велосипедную абстракцию для построения подобных конструкций по всему проекту, которая потом вылезет боком, или в стопятсот местах говнокодить одинаковый DB::raw?
СУБД прекрасно это умеет
это твой говнокод выше с имитацией json'а. Я вообще в ахуе, что кому то пришла такая идея в голову.
я не вижу проблем в том чтобы написать гидрацию при необходмиости.
Это известный и вполне рабочий подход.
Ну да, почему бы и нет - покрыть весь проект raw'ами и разгребать это говно через годик :)
Это известный и вполне рабочий подход.
Да ну? Известный где, в твоих проектах?
И как это не относится? Код НУЖНО писать хорошо. Примера вверху это не касается. Даже и близко. СОВСЕМ.
мешают стандарты, принятые в разработке.
АПИ не должно быть привязано ни к какому юзеру, и, следовательно, никакой таймзоны он не знает.
Стандартизация. Везде UTC. Потому что так проще всем.
при этом принимать таймзону как параметр- может. Вопрос - нахрена?
имейте уважение к чужому времени. Вам дали наводку, поискать могли и сами.
В сообществах полно информации почему не стоит хранить часовые пояса в БД.
The Problem with Time & Timezones - Computerphile
Что должен знать о времени каждый программист
при этом принимать таймзону как параметр
- может. Вопрос - нахрена?
Где ответ на вопрос с публичным АПИ? Будете к каждому запросу лепить таймзону как параметр?
Еще вопрос: как будете выводить дату, если по ТЗ нужно вывести ее в двух часовых зонах - локальной и по Moscow? Ваш лучший вариант - спарсить дату в указанной таймзоне momentjs'ом, предварительно указав таймзону, и засетать Moscow. Консистентность? Не, не слышал.
Еще вопрос, который я уже задавал: каким образом будете фиксить неправильное время на ПК клиента? Вы можете гарантировать, что у каждого, кто пользуется вашим фронтом, будет верное время? Нет? Каким образом будете компенсировать? Добавлять ВТОРОЙ параметр, помимо таймзоны, типа offset и указывать кол-во часов-минут?
Это негласный стандарт, конечно же. Такой же, как и ХРАНЕНИЕ дат в UTC.
Вон, в примере, необходимо сгруппировать данные по дате с учетом таймзоны клиента. Предположим, а таблице с данными 100000 записей. Их все на клиент перекинуть и там группировать?
Да, конечно.
то сервер их и отдаст.
то можно указывать значение offset прямо в параметре timezone
Ах негласный. Ну тогда все понятно, конечно.
Извини, но это хуйня какая-то.
он, в примере, необходимо сгруппировать данные по дате с учетом таймзоны клиента. Предположим, а таблице с данными 100000 записей. Их все на клиент перекинуть и там группировать?
Вернется то 100 тысяч записей что с группировкой, что без, и перекинуть нужно будет сто тысяч в обеих случаях - в чем разница?
Лол. То есть отдавать одни и те же данные дважды, просто потому что фронту лень работать с датами? От бека идет минимальный нужный набор данных. Данные от бека должны быть МАКСИМАЛЬНО независимыми от фронта.
Мда. А давайте ка придумаем велосипед, которым ОЧЕНЬ УДОБНО пользоватся, а так же забудем о консистентности (в каждом запросе одни и те же данные могут означать разные вещи - что есть пиздец), ради того, что бы.. что бы что? Я так и не понял, нахрена так делать.
Именно негласный. Точно такой же, как и хранение дат в UTC в базе, а не в чем-то другом. Или использование utf8mb4 вместо utf8/любой другой в mysql. Или расстановка foreign ключей. Или тайп-хинтинг + var аннотации. Продолжать?
использование utf8mb4 вместо utf8/любой другой в mysql.
расстановка foreign ключей
тайп-хинтинг + var аннотации
Разница в том что при серверной группировке нет необходимости отдавать все 100000 записей клиенту. Достаточно отдать одну страницу - например, сгруппированные записи за 20 дней.
Опять данные кому-то должны, эх. Задача в том, чтобы у пользователя максимально быстро открылся сайт. Плюс предварительной обработки данных на сервере в том, что, во-первых, пользователю не придется скачивать js-код, который будет заниматься обработкой на его стороне, а, во-вторых, клиентскому устройству не придется этот код исполнять.
можно будет определить часовое смещение пользователя
Приведу примеры, когда эти рекомендации спокойно можно игнорировать. Или даже нужно.
Если не планируется мультиязычности, то никакой разницы.
Вредный overhead на мелких проектах. Не нужен.
Аннотации для переменных при наличии тайпхинтинга
Делаешь orderBy + where за последние двадцять дней. То, что ты бы делал и без твоей говно-групировки, только быстрее и проще.
Что за бред? Человек делает АПИ, а не монолит с рендерингом на сервере. У него приложение - SPA, которое само по себе АПРИОРИ JS. И momentjs, весом в 22кб gzip, в сравнении с всем фронтовым приложением не весит нихрена.
Еще вопрос: что если тебе нужно в одном запросе отправить две даты: одна от юзера, а вторая - с какого-нить гуглосервиса в UTC. Будешь делать на каждую дату по параметру? Или конвертить гуглодату по оффсету в юзерскую дату, а потом на беке снова назад? Или второй параметр ignore?
future proofing - не, не слышал
Конечно не нужен. Кому нужны индексы? Кому нужна гарантия целостности данных?
... и мы получаем 15 элементов после группировки на клиенте вместо 20, потому что 5 дней не было никаких событий. Проблема в том, что клиент не знает количество элементов после группировки пока не сгруппирует.
Какая разница, SPA это или нет? Из таких вот моментов и раздувается приложение на ровном месте.
И перенос подобной логики на сервер поможет с этим справиться.
Если предполгается, что даты могут приходить в разных таймзонах, то да, необходимо дать возможность указания таймзоны для каждой даты. Впрочем, вы углубляетеся в дебри сослагательного наклонения. Тут нам уже необходим конкретный пример с конкретной проблемой. Опишите предполагаемую архитектуру приложения и какой функционал необходимо добавить, а я могу подготовить вам решения и уточнить их плюсы и минусы если реализация будет вынесена на серверную сторону.
Слышал про преждевременную оптимизацию. Очень вредная штука.
На мелких проектах - никому. Пустая трата денег заказчика.