В предыстории к проблеме: я начинающий ООПшник, много чего не знаю много чего не понимаю. Свой вопрос я гуглю уже больше недели, по сему принял решение написать сюда. Буду благодарен как за отсылку к материалам так и за прямой ответ. Наверное у меня еще не четко сформулировался вопрос, по этому я не могу найти ответ=))
Итак. есть предположим две таблички в БД
admins:
id | name
0 | Петя
1 | Вася
sale:
id | a_id | date | payment
0 | 0 | 2016-01-01 | 1000
0 | 0 | 2016-01-01 | 1500
0 | 1 | 2016-01-01 | 1000
0 | 1 | 2016-01-01 | 1200
0 | 0 | 2016-01-02 | 1000
как видно у админа за день может быть много продаж. или не быть совсем.
Задача:
Вывести табличкой по оси Y админы по оси X дни месяца (все даты за месяц). В пересечении столбцов сумма.
Как реализовано:
Есть модель под названием например Sale, в ней я получаю табличку с админыми далее я делаю джойню выборку из таблиц продаж сгруппированную по админам и дням и возвращаю как массив.
SELECT a.id aid, a.name name,
GROUP_CONCAT(s.date_pements SEPARATOR '||') date_pements //получаем выывод для админа Петя: 2016-01-01^2500||2016-01-0^1000
FROM admins a
LEFT JOIN // мне нужно вывести всех админов, не важно были ли у них продажы или нет
(
SELECT a_aid,
CONCAT_WS('^', date, SUM(payment)) date_pements //это я делаю чтобы когда я буду разлеплять массив я четко понимал к какой дате относиться платеж
FROM sale
WHERE date between 2016-01-01 and 2016-01-31
GROUP BY date
) s ON s.a_id = a.a_id
GROUP BY aid
Запрос не проверял, надюсь все верно, так как у меня еще там много чего (админы в дереве лежат, + часы + еще много много чего). после все это надо разлепить ессесвенно.
получаеться мега запросище.
А душа просит простых решений по типу:
foreach($admins as $admin){
$admin->date('2016-01-01')->peyment
}
Как это реализовать я где то смутно предпологаю. но это влечет за собой подобное обращение к БД:
SELECT SUM(payment) FROM sale WHERE a_aid = 0 AND date = '2016-01-01'
Что приводит примерно к 10 000 запорсов к БД. (админов много, много дней и еще по мимо поалт есть куища вского говна котрое надо вывести). Что ООЧЕНЬ медленно отрабатывает.
Вопрос:
1)Как реализовать подобную структру:
foreach($admins as $admin){
$admin->date('2016-01-01')->peyment
}
Но чтобы например у меня не шло обращение к БД а даннные подцеплялись из заранее выбранных массивов тоесть яделаю так
SELECT date, a_aid, payment FROM sale WHERE date between 2016-01-01 and 2016-01-31
а далее уже из этой выборки подцепляю нужные данные. По моему разумению это довольно быстро будет отрабатывать.
2) как это сделать еще таким образом чтобы у меня была не одна модель sale а две модели admins и sale. я так понимаю что мне надо копать в сторону изучаения active records но как то они не уложаться в моей голове. куда смотреть?