Выборка из БД, отчет

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Leffken
Сообщения: 115
Зарегистрирован: 2015.07.10, 15:49
Откуда: yola
Контактная информация:

Выборка из БД, отчет

Сообщение Leffken »

Всем привет. Как лучше формировать отчеты, в поисковой модели или контроллере ?
Например, отчет о расходах за период каждого сотрудника.
Сначала я сделал просто все расходы, но я делал в контроллере и таким образом :

Код: Выделить всё

$allDriver = Driver::find()->select(['id','Fio'])->all();
$allDriverArray = ArrayHelper::map($allDriver, 'id', 'Fio');
foreach ($allDriverArray as $key => $value) {
            $driver = Driver::findOne($key);
            $trips = $driver->idTrips;
            $tripsArray = ArrayHelper::toArray($trips); 
            $sumArray = array();            
            foreach ($tripsArray as $trip) {
                $sumArray[$id] = $sumArray[$id] + $trip['Cost'];
            }
}
 
Мне почему то кажется, что это не много не правильно, потому что использую связи между таблицами только в одном месте: $trips = $driver->idTrips;
Я предполагаю что это делается сложным запросом к нескольким таблицам на основе связи между ними. Но как это организовывается и разбирается не совсем понимаю

lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Re: Выборка из БД, отчет

Сообщение lgXenos »

Leffken писал(а):в поисковой модели или контроллере ?
В контроллере могуть быть лишь строчки вида

Код: Выделить всё

$data = Model::getReportData([..данные из post/get..]);
return $this->render('report', ['data'=>$data]);
 

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Выборка из БД, отчет

Сообщение Nerf »

lgXenos писал(а): В контроллере могуть быть лишь строчки вида
Ложь и провокация :roll:

satoved
Сообщения: 14
Зарегистрирован: 2015.10.07, 17:51

Re: Выборка из БД, отчет

Сообщение satoved »

А одним запросом с SUM и JOIN не обойтись?

Leffken
Сообщения: 115
Зарегистрирован: 2015.07.10, 15:49
Откуда: yola
Контактная информация:

Re: Выборка из БД, отчет

Сообщение Leffken »

satoved писал(а):А одним запросом с SUM и JOIN не обойтись?
Можно по подробнее?
Может рабочий примерчик есть или просто не большая статья по поводу сложных запросов.

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Выборка из БД, отчет

Сообщение Nerf »

Код: Выделить всё

$allDriver = Driver::find()->select(['id','Fio'])->all();
$allDriverArray = ArrayHelper::map($allDriver, 'id', 'Fio');
foreach ($allDriverArray as $key => $value) {
            $driver = Driver::findOne($key);
            // ...
} 
Ваша логика не ясна в этом моменте. Зачем сначала получать кривые модели(select в ar бред, делали бы хотя бы asArray()), потом отдельным запросом в цикле тянете саму модель?
Если генерация отчета не критична ко времени, то сделайте в лоб.
Если критична, сделайте запрос, как предложили.

Leffken
Сообщения: 115
Зарегистрирован: 2015.07.10, 15:49
Откуда: yola
Контактная информация:

Re: Выборка из БД, отчет

Сообщение Leffken »

Nerf писал(а):

Код: Выделить всё

$allDriver = Driver::find()->select(['id','Fio'])->all();
$allDriverArray = ArrayHelper::map($allDriver, 'id', 'Fio');
foreach ($allDriverArray as $key => $value) {
            $driver = Driver::findOne($key);
            // ...
}
Ваша логика не ясна в этом моменте. Зачем сначала получать кривые модели(select в ar бред, делали бы хотя бы asArray()), потом отдельным запросом в цикле тянете саму модель?
Если генерация отчета не критична ко времени, то сделайте в лоб.
Если критична, сделайте запрос, как предложили.
В лоб это через массивы или как ? В этом случае по сути связи между таблицами практически не используются или что то не так понимаю ?

lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Re: Выборка из БД, отчет

Сообщение lgXenos »

Nerf писал(а):Ложь и провокация :roll:
Согласен. В прошлом рабочем проекте в контроллерах спокойно располагается вся логика и вьюха. Кто только придумал это MVC
:)

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Выборка из БД, отчет

Сообщение Nerf »

lgXenos писал(а):
Nerf писал(а):Ложь и провокация :roll:
Согласен. В прошлом рабочем проекте в контроллерах спокойно располагается вся логика и вьюха. Кто только придумал это MVC
:)
Вы(как и некоторые на этом форуме) трактуете, что есть только белое и черное. В MVC может быть и пассивная, и активная модель, может быть тонкий и толстый контроллер и т.п. Что хорошо, что плохо понятно. Сейчас моден DDD, единственный верный подход? Вы всегда неукоснительно следуете SOLID, слоеной архитектуре и т.п.? Считаете, что стоит потратить в разы больше времени, написать в разы больше кода для решения задачи, которая выполняется раз в месяц и не требует поддержки\расширения?
ПС: Это так, риторические вопросы :roll: Если вы отвечаете утвердительно, то возникает другой риторический вопрос: зачем вы используете yii?

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Выборка из БД, отчет

Сообщение Nerf »

Leffken писал(а): В лоб это через массивы или как ? В этом случае по сути связи между таблицами практически не используются или что то не так понимаю ?
Сделайте как то так:

Код: Выделить всё

Driver::find()->select(['fio' => Driver::tableName() . '.Fio', 'sum' => 'SUM(t.Cost)'])->joinWith(['idTrips t'], false)->groupBy(Driver::tableName() . '.Fio')->asArray()->all(); 

lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Re: Выборка из БД, отчет

Сообщение lgXenos »

Nerf писал(а):Вы всегда неукоснительно следуете SOLID, слоеной архитектуре и т.п.?
Руку на сердце? Я пишу гамно-код.
И именно тогда, когда я это осознаю я стараюсь бить себя по рукам и привести это хоть на что-то похожее.
Nerf писал(а):Считаете, что стоит потратить в разы больше времени, написать в разы больше кода для решения задачи, которая выполняется раз в месяц и не требует поддержки\расширения?
Я работаю с живым проектом. И каждый программист думает, что его кусок кода больше не поменяется.
А спустя месяц-два я хватаюсь за голову, т.к. мне надо этот кусок кода сейчас в еще двух местах. И ожидание копи-паста мне "не доставляет"... Приходится садится, переделывать, выносить куда-то... Т.к. это не масштабируемо
Nerf писал(а):ПС: Это так, риторические вопросы :roll: Если вы отвечаете утвердительно, то возникает другой риторический вопрос: зачем вы используете yii?
Смотря как звучит этот вопрос: зачем мы используем фрейм-ворк, или зачем мы используем этот фреймворк.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выборка из БД, отчет

Сообщение zelenin »

Nerf писал(а):Вы(как и некоторые на этом форуме) трактуете, что есть только белое и черное. В MVC может быть и пассивная, и активная модель, может быть тонкий и толстый контроллер и т.п. Что хорошо, что плохо понятно. Сейчас моден DDD, единственный верный подход? Вы всегда неукоснительно следуете SOLID, слоеной архитектуре и т.п.? Считаете, что стоит потратить в разы больше времени, написать в разы больше кода для решения задачи, которая выполняется раз в месяц и не требует поддержки\расширения?
ПС: Это так, риторические вопросы :roll: Если вы отвечаете утвердительно, то возникает другой риторический вопрос: зачем вы используете yii?
что за чушь? речь об обычной компоновке кода.
На вынос генерации отчета в ReportGenerator::generate() уйдет очень мало времени.

Аватара пользователя
S c
Сообщения: 878
Зарегистрирован: 2012.04.11, 14:46

Re: Выборка из БД, отчет

Сообщение S c »

Nerf писал(а):Вы(как и некоторые на этом форуме) трактуете, что есть только белое и черное. В MVC может быть и пассивная, и активная модель, может быть тонкий и толстый контроллер и т.п. Что хорошо, что плохо понятно. Сейчас моден DDD, единственный верный подход? Вы всегда неукоснительно следуете SOLID, слоеной архитектуре и т.п.? Считаете, что стоит потратить в разы больше времени, написать в разы больше кода для решения задачи, которая выполняется раз в месяц и не требует поддержки\расширения?
ПС: Это так, риторические вопросы :roll: Если вы отвечаете утвердительно, то возникает другой риторический вопрос: зачем вы используете yii?
Пример не корректен)) подобную логику оформить в функцию +1 минута времени. зато код чист и душа спокойна :)
это не ddd, и не solid. Это желание с пустого места не превращать проект в мусорку.

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Выборка из БД, отчет

Сообщение Nerf »

Я написал в общем, не касаясь конкретно этой задачи. Лишь огрызнулся на выпад, что у нас MVC, и так нельзя) . Но суть та же. Вынос кода в сервис/функцию для сиеминутной задачи абсурден. Если понадобится масштабирумость, то не будет никакой проблемы это оформить, уже зная какой круг задач нужно будет решать.
zelenin, уйдёт совсем мало времени у кого: у вас, у меня, у автора топика?..

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выборка из БД, отчет

Сообщение zelenin »

Nerf писал(а):Я написал в общем, не касаясь конкретно этой задачи. Лишь огрызнулся на выпад, что у нас MVC, и так нельзя) . Но суть та же. Вынос кода в сервис/функцию для сиеминутной задачи абсурден.
мне очевидно, что нет. Буквально дня три назад столкнулся с "захардкоженным" в контроллере получением данных с достаточно сложной логикой типа получить то, получить се, если меньше то умножить, если больше то округлить, часть данных получить из солр, часть из постгрес, итд, в общем строк на 20 логики. Человек, прописавший все в контроллере, видимо руководствовался той же сиюминутностью задачи, хотя вынеся бы в сервис, я мог заюзать типа getSomeNotSimpleModels(10);. А основная соль в том, что в проекте этот захардкоженный код скопипасчен уже в 4 местах, что не поддерживаемо при изменении требований выборки.
А ну да: у меня была задача сделать карусельку с товарами, выбранной по логике "как вон там". И вот этот "как вон там" уже в 4 местах дублируется. Жду задачу "изменить выборку в месте 1", за ней "Починить выборку в месте 2", а сломавшуюся выборку в месте 3 и 4 заметят только через год...
Nerf писал(а):Если понадобится масштабирумость, то не будет никакой проблемы это оформить, уже зная какой круг задач нужно будет решать.
в условиях цейтнота никто этим заниматься не будет, поскольку кроме непосредственно вынесения кода, надо еще проводить аналитику, где подобный код заюзан и какие сайд-эффекты могут быть. Поэтому ошибку допускает первый написавший код, а не следующие, скопипастившие его.
Nerf писал(а):zelenin, уйдёт совсем мало времени у кого: у вас, у меня, у автора топика?..
каким навыком надо не обладать, чтобы потратить много времени на создание класса с копипастой в метод из контроллера?

Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Выборка из БД, отчет

Сообщение Nerf »

zelenin писал(а):мне очевидно, что нет. Буквально дня три назад столкнулся с "захардкоженным" в контроллере получением данных с достаточно сложной логикой типа получить то, получить се, если меньше то умножить, если больше то округлить, часть данных получить из солр, часть из постгрес, итд, в общем строк на 20 логики. Человек, прописавший все в контроллере, видимо руководствовался той же сиюминутностью задачи, хотя вынеся бы в сервис, я мог заюзать типа getSomeNotSimpleModels(10);. А основная соль в том, что в проекте этот захардкоженный код скопипасчен уже в 4 местах, что не поддерживаемо при изменении требований выборки.
Ну, вы описываете другую проблему. Сложный код должен упрощаться. Проблема кроется в том, что "скопипасчен уже в 4 местах", проблема в том, кто скопипастил код трижды, не вынеся общий код.
zelenin писал(а): в условиях цейтнота никто этим заниматься не будет, поскольку кроме непосредственно вынесения кода, надо еще проводить аналитику, где подобный код заюзан и какие сайд-эффекты могут быть. Поэтому ошибку допускает первый написавший код, а не следующие, скопипастившие его.
Вы предлагает с ходу писать универсальное решение, на которое "уйдет очень мало времени"? Его не надо будет рефакторить в будущем? Вам аналогично придется уделять время на аналитику и т.п. На преждевременную оптимизацию похоже.
zelenin писал(а): каким навыком надо не обладать, чтобы потратить много времени на создание класса с копипастой в метод из контроллера?
Вы на этом форуме достаточно долго, сколько вопросов вы видели от новичков, которые не обладают такими навыками?) Лучше сразу в дебри отправлять?.. Да и вынос в класс с копипастой не гарантирует, что человек, 3ды скопипастивший код, не сделает новый класс и т.п. :lol:

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Выборка из БД, отчет

Сообщение zelenin »

Nerf писал(а):Ну, вы описываете другую проблему. Сложный код должен упрощаться. Проблема кроется в том, что "скопипасчен уже в 4 местах", проблема в том, кто скопипастил код трижды, не вынеся общий код.
нет, это максимально упрощенный код, дальше некуда. Проблема в том, что не вынесено в сервис изначально. Каждый следующий разработчик при задаче "сделать как там" копипастил код, вместо подсмотреть какой сервис дергается и дернуть его. Просто не должно быть логики в контроллерах - все должно быть реюзабельно.
Nerf писал(а):Вы предлагает с ходу писать универсальное решение, на которое "уйдет очень мало времени"? Его не надо будет рефакторить в будущем? Вам аналогично придется уделять время на аналитику и т.п. На преждевременную оптимизацию похоже.
мне надо получить данные по определенным критериям - что тут может быть универсального? я пишу это, но выделяю в сервис, тратя время на 5 строчек, которые обязательно надо написать в сервисе - имя класса, метода, неймспейса - остальное остается ровно таким же, если бы было захардкожено в контроллере.
Nerf писал(а):Вы на этом форуме достаточно долго, сколько вопросов вы видели от новичков, которые не обладают такими навыками?)
навыками создания нового класса? они просто не знают про сервисы, поскольку в yii сообществе например вы в этой ветке пропагандируете тяп-ляп. Вместо: - создай сервис. - а что это? - а это класс из 5 строчек. - можно пример. - вот. - ох, круто.

Nerf писал(а):Лучше сразу в дебри отправлять?.. Да и вынос в класс с копипастой не гарантирует, что человек, 3ды скопипастивший код, не сделает новый класс и т.п. :lol:
не может человек, целенаправленно создавший сервис, сказать, что сервисы это дебри, потому что сервис - это простейший концепт ооп-архитектуры - это класс, инкапсулирующий некую общую логику. То, что yii-разработчик привык писать в модели, нужно выделять в сервисы с оверхедом только на создание класса. Создай уже свой первый сервис.
Защиты от дурака быть не может - если тебе говорят, сделай как там, ты идешь туда, видишь сервис, который ровно это делает, но сервис копипастишь, то тут ничего не поделаешь. Этот человек и модель User скопипастит, чтобы добавить новый функционал. Мы не будем рассматривать примеры дебилии.

Аватара пользователя
ElisDN
Сообщения: 5598
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Выборка из БД, отчет

Сообщение ElisDN »

Nerf писал(а):Предлагаете с ходу писать универсальное решение, на которое "уйдет очень мало времени"?
Странно... Я ещё в школе научился код в процедуры и функции выносить. С какого момента это стало немодным?

Ответить