[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ООП программирование + mysql + производительность
docentovich
В предыстории к проблеме: я начинающий ООПшник, много чего не знаю много чего не понимаю. Свой вопрос я гуглю уже больше недели, по сему принял решение написать сюда. Буду благодарен как за отсылку к материалам так и за прямой ответ. Наверное у меня еще не четко сформулировался вопрос, по этому я не могу найти ответ=))

Итак. есть предположим две таблички в БД

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 но как то они не уложаться в моей голове. куда смотреть?
Игорь_Vasinsky
в чём вопрос то? как нарисовать график или как правильно составить запрос?

Цитата
я начинающий ООПшник

бывает, потом отпустит.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
docentovich
я раньше времени отпарвил пост. вопрос дописал
docentovich
Прошу прощения за опечатки. В упор не вижу кнопку редактировать....
docentovich
тоесть как сформировать

foreach($admins as $admin){
$admin->date('2016-01-01')->peyment
}

с помощью конструктора запросов я понимаю. но это повлечет к падению производительности из за увеличение в тысячи раз кол-ва запросов к бд.

я хочу чтобы подключалось две модели. admin и sale при иницализации первая выбирала всех админов, вторая выбирала все продажы за месяц (итого два запроса к бд), но как дальше наладить связь админа->день(промежуточная модель что ли нужна тут?)->оплата я не разумею.
docentovich
И еще хочу чтобы это было абстрактоно, чтобы я мог применить эту схему в другом месте кода=)))
docentovich
или так:

foreach($admins as $admin){
$admin->peyment(['date'=>'2016-01-01]);
}
docentovich
а в другом компоненте может быть использовано вот так:

foreach($peyments as $peyment){
$peyment->admin->name;
}

например
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.