одном запросе со списком пользователей?
$arQueryParams = [
'select' => ['*', 'GROUPS_IDS'],
'runtime' => [
new Entity\ExpressionField('GROUPS_IDS', '(SELECT GROUP_CONCAT(b_user_group.GROUP_ID) FROM b_user_group WHERE b_user_group.USER_ID = main_user.ID)')
]
];
$obj = \Bitrix\Main\UserTable::getList($arQueryParams);
есть. называется - два запроса
Не прокатит, это надо архитектуру классов выгрузки менять.
При таком запросе у вас невалидные данные, т.к. принадлежность к группе 2 не будет выбрана. Равно как и будет ошибка выбора принадлежности к группам с учетом текущей даты. Ну и надо, видимо, менять архитектуру.
Это что за группа? Вроде все группы через запятую выгружает
GROUPS уже есть в сущности. Просто делаем выборку. Пример через Entity_Objects, но можно и через fetch, только учесть, что во втором случае группы приходят разными fetch-ами, то есть нужно их тоже в цикле собирать, группируя по пользователю use Bitrix\Main\Entity\Query; use Bitrix\Main\UserTable; $res = (new Query(UserTable::getEntity())) ->whereIn('ID', [1, 3, 4, 5, 6]) ->setSelect(['ID', 'NAME', 'LAST_NAME', 'GROUPS.GROUP_ID']) ->exec(); $users = []; while($uEo = $res->fetchObject()) { $currentUser = [ 'NAME' => $uEo->getName(), 'LAST_NAME' => $uEo->getLastName(), 'GROUPS' => [] ]; foreach($uEo->getGroups() as $gEo) { $currentUser['GROUPS'][] = $gEo->getGroupId(); } $users[$uEo->getId()] = $currentUser; } unset($currentUser);
Попробовал так у себя - работает $query = GroupTable::query() ->setSelect(['NAME', 'ID', 'USERS', 'USERS.USER.SHORT_NAME', 'USERS.USER.ID']) ->registerRuntimeField( (new OneToMany('USERS', UserGroupTable::class, 'GROUP')) ->configureJoinType(\Bitrix\Main\Entity\Query\Join::TYPE_LEFT) ); foreach ($query->fetchCollection() as $group) { print_r('<b>' . $group->getName() . '</b>:<br />'); foreach ($group->get('USERS') as $userGroup) { $user = $userGroup->getUser(); $user and print_r($user->getShortName() . ';<br />'); } }
Спасибо, я покурю это. Видимо придётся все же расширять функционал модуля экспорта до произвольного Query . Пока модуль умеет выгружать только результаты getList. Думал смогу красиво всё в один fetch впихнуть. Но красиво не выходит.
getList — это те же яйца, только вид снизу (уровнем ниже: загляните в UserTable::getMap). Я просто работаю с Query, но точно тот же подход с getList-ом
Спасиб! Но Это же у нас группы с пользователями, а мне надо пользователи с ID групп. Или ошибались ошибаюсь? Не за компом.
Спвсибо, надо себе выкачать ядро и смотреть, все руки не доходят.
и проиндексировать в ide, и разрабатывать проекты локально, и никогда-никогда больше не спрашивать в чате в какой по счету параметр передают select в старом гетлисте:D
Погонял этот вариант на 14000+ юзерах, Время выполнения: 31.443738 мой вариант с подзапросом Время выполнения: 0.573712
Таблица юзеров с 40 312 душами
Не выводил результат, чтобы не терялось время
Вы в сообщении сравниваете работу запросов, а говорите суммарно про php-код?
Я в целом сравниваю один и тот же результат.
аа, там же через это как раз и есть доступ (new OneToMany('GROUPS', UserGroupTable::class, 'USER')) ->configureJoinType(Entity\Query\Join::TYPE_INNER), тогда достаточно будет фильтрацию прописать по GROUPS.GROUP_ID, верно?
Вам если я правильно слежу нужно where not in
Так. Может еще подскажете. Так как там у групп INNER JOIN, то все удваивается, а если добавлять 'group' ключ, то все поля прпадают в группировку и ничего не группируется. вопрос - как сгруппировать результат так, чтобы он выводился корректно?
Обсуждают сегодня