Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть 3 таблицы
1)group
id title data ...
2)ticket
id group_id user_id data ...
3)user
id way time amount ...
Суть, мне нужно вывести таблицей данные (имя группы / количество пользователей купивших билеты / количество купленных билетов относительно группы) получить данные по билетам, но вывести я должен их основываясь по группе.
Что я делаю:
получаю список всех групп, передаю в вьювер, в вьювере перебираю массив и обращаюсь в модель, по иду вытаскиваю с таблицы билеты количество купленных, потом в этой же итерации обращаюсь к тикетам опять же. забираю юсер иды, и передаю их в таблицу юзер и считаю юзеров.
Как это можно упростить? ибо пару раз получал ошибку 502 когда было больше 500к тестовых "покупок"
Делал через hasMany
в другом месте подобную задачу реализовал сдлеющим образом
запрашиваю всех юзеров передаю в форыч, пробигаю по всем и с помощью гроуп бай забирал все билеты по данному юзеру добавляя запрос whereIn и запрос в таблицу гроуп что бы забрать удовлетворящие иды по гроуп ид
Чуть позже могу скинуть запросы, просто в соседней теме прочитал, что агригировать 3 раза не гуд, вот и понять пока не могу как лучше реализовать задачу? либо менять структуру бд
Не в сети
foreach (AnalyticsVisitor::where('date', '>=', $daterangepicker_start)->where('date', '<=', $daterangepicker_end)->groupBy($stat)->orderby($stat, 'asc')->get() as $AnalyticsV) {
$total = AnalyticsImp::whereIn('visitor_id', AnalyticsVisitor::where('date', '>=', $daterangepicker_start)->where('date', '<=', $daterangepicker_end)->where("$stat", $AnalyticsV->$stat)->pluck('id')->toArray())->where('group_id', '=', $id)->count();
$uniq = AnalyticsVisitor::whereIn('id', AnalyticsImp::where('group_id', '=', $id)->pluck('visitor_id')->toArray())->where("$stat", $AnalyticsV->$stat)->where('date', '>=', $daterangepicker_start)->where('date', '<=', $daterangepicker_end)->count();
$backup = AnalyticsImp::whereIn('visitor_id', AnalyticsVisitor::where('date', '>=', $daterangepicker_start)->where('date', '<=', $daterangepicker_end)->where("$stat", $AnalyticsV->$stat)->pluck('id')->toArray())->where('group_id', '=', $id)->where('backup', '=', 1)->count();
$Data[] = [
'name' => $AnalyticsV->$stat,
'total' => $total,
'visits' => $uniq,
'backup' => $backup
];
}
if ($stat != "date") {
usort($Data, function ($a, $b) {
return $b['visits'] - $a['visits'];
});
}
Не в сети
Хочу его оптимизировать ибо на стр получается 61 запрос
+ в запросах вижу ис нот нуЛ, от этой проверки можно избавиться? в бд полям поставил нул по дефолту, но ничего не поменялось
в первом посту привел аналогию с другими таблицами, все так же, просто названия таблиц другое
Изменено adams (30.06.2017 16:51:34)
Не в сети
ну здесь явно во-первых не выполняется жадная загрузка из analytics_imps – по идентификатору группы в цикле идут выборки. если группа берётся из tags_groups (вообще имена таблиц явно не по соглашениям ларавель – легаси-проект?) – то аналитика должна выбираться вместе с группами с помощью ->with() или ->load()
во-вторых, повторяющиеся полностью идентичные запросы – признак неправильной работы со связями. $model->relation выберет данные если нужно, но не будет делать запроса если данные уже выбраны, $model->relation() – это всегда новый запрос, причём выбранные данные нигде не запоминаются
в-третьих, пересчитывать count(*) каждый раз когда открывается страница бессмысленно – если ты задним числом не добавляешь данные за предыдущие даты, то как только день «закрыт» его счётчик больше никогда не меняется, соответственно его нужно один раз посчитать, сохранить в отдельную таблицу со сводными данными и брать оттуда каждый раз когда он нужен
в-четвёртых, явно в analytics_imps должен быть индекс по [date, group_id] или [group_id, date] – надо смотреть что нужнее. при суррогатных индексах мускл умеет выбирать только по первому полю из индекса, но не умеет – только по второму. так что если ты где-то выбираешь сводные данные по группе но не по дате – второй вариант, если по дате без группы – первый.
в-пятых is not null тут без разницы. оптимизатор запросов сам от него избавится, он умный…
Не в сети
Примерно понял о чем Вы. но можно с Вами связаться отдельно? Я написал Вам на почту, просто хочу проконсультироваться (платно, не за 300р как кто-то помню писал в теме)))),
Не в сети
Эх так и не получил от вас ответа)
1)Что значит не по соглашениям ларавел (я про названия таблиц)
2)Из 61 запроса удалось добиться 9 запросов (не зависимо от кол-во групп) с помощью жадной загрузки.
3)Про агрегацию, если данных очень много, не только по дням, а и по странам, городам и тп, помоему не выгодно все считать и в таблицы класть, сделал получение просто с бд и через count в пхп их считаю
пс если все таки отпишите на емейл, был бы рад с вами побеседовать, я про консультацию
псс
в вьювере вывожу вот так
<small>{{$User->permissionsGroup->name}}</small>
не пойму чего он так ругается (откуда повторные запросы?!)
Изменено adams (02.07.2017 01:31:36)
Не в сети
не пойму чего он так ругается (откуда повторные запросы?!)
ну дебагбар же пишет – view backEnd.users строка 81
3)Про агрегацию, если данных очень много, не только по дням, а и по странам, городам и тп, помоему не выгодно все считать и в таблицы класть, сделал получение просто с бд и через count в пхп их считаю
это вообще удобнее делать на elasticsearch, мускл не особо эффективен при поиске по случайному набору параметров, когда нельзя запрос оптимизировать через индекс… впрочем если набор данных маленький – вообще без разницы…
Примерно понял о чем Вы. но можно с Вами связаться отдельно? Я написал Вам на почту, просто хочу проконсультироваться
у меня просто нету времени на это. на форуме всё просто – есть конкретный вопрос, если мне есть что посоветовать – я пишу, а нет – молчу, кто-нибудь другой напишет. консультация подразумевает затраты времени и может даже необходимость разбираться с чужим проектом – на это у меня времени нет…
Не в сети
1)В этой строке
<small>{{$User->permissionsGroup->name}}</small>
Как он делает запрос то в бд?)))
2)Немного не пойму про индексы, если их юзать просто время ответа уменьшиться, если смотреть через дебагер?
3)В коде разбираться не нужно, просто хотел узнать ваше мнение по поводу пары моментов, как сделать лучше ибо друзей которые давно пишут на ларавел нет.
Не в сети
Как он делает запрос то в бд?
всё зависит от того что находится в permissionGroup() на модели User. надо полагать что там возвращается не связь…
Не в сети
Страницы 1