208 похожих чатов

Есть какой-то более правильный способ получить список групп пользователя в

одном запросе со списком пользователей?

$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);

21 ответов

18 просмотров

есть. называется - два запроса

Антон (code-pilots)- Автор вопроса
Eugene Zhukov
есть. называется - два запроса

Не прокатит, это надо архитектуру классов выгрузки менять.

Антон (code-pilots)
Не прокатит, это надо архитектуру классов выгрузк...

При таком запросе у вас невалидные данные, т.к. принадлежность к группе 2 не будет выбрана. Равно как и будет ошибка выбора принадлежности к группам с учетом текущей даты. Ну и надо, видимо, менять архитектуру.

Антон (code-pilots)- Автор вопроса
Eugene Zhukov
При таком запросе у вас невалидные данные, т.к. пр...

Это что за группа? Вроде все группы через запятую выгружает

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 />'); } }

Антон (code-pilots)- Автор вопроса
AlexeyGfi
GROUPS уже есть в сущности. Просто делаем выборку....

Спасибо, я покурю это. Видимо придётся все же расширять функционал модуля экспорта до произвольного Query . Пока модуль умеет выгружать только результаты getList. Думал смогу красиво всё в один fetch впихнуть. Но красиво не выходит.

Антон (code-pilots)
Спасибо, я покурю это. Видимо придётся все же расш...

getList — это те же яйца, только вид снизу (уровнем ниже: загляните в UserTable::getMap). Я просто работаю с Query, но точно тот же подход с getList-ом

Антон (code-pilots)- Автор вопроса
⚒ ᎪᏞᎬᏦᏚᎪɴᎠᎡ ⚒
Попробовал так у себя - работает $query = GroupTa...

Спасиб! Но Это же у нас группы с пользователями, а мне надо пользователи с ID групп. Или ошибались ошибаюсь? Не за компом.

Антон (code-pilots)- Автор вопроса
AlexeyGfi
screenshot getList — это те же яйца, только вид снизу (уровне...

Спвсибо, надо себе выкачать ядро и смотреть, все руки не доходят.

Антон (code-pilots)
Спвсибо, надо себе выкачать ядро и смотреть, все р...

и проиндексировать в ide, и разрабатывать проекты локально, и никогда-никогда больше не спрашивать в чате в какой по счету параметр передают select в старом гетлисте:D

Антон (code-pilots)- Автор вопроса
AlexeyGfi
GROUPS уже есть в сущности. Просто делаем выборку....

Погонял этот вариант на 14000+ юзерах, Время выполнения: 31.443738 мой вариант с подзапросом Время выполнения: 0.573712

Антон (code-pilots)- Автор вопроса
AlexeyGfi
screenshot Таблица юзеров с 40 312 душами

Не выводил результат, чтобы не терялось время

Антон (code-pilots)
Не выводил результат, чтобы не терялось время

Вы в сообщении сравниваете работу запросов, а говорите суммарно про php-код?

Антон (code-pilots)- Автор вопроса
AlexeyGfi
Вы в сообщении сравниваете работу запросов, а гово...

Я в целом сравниваю один и тот же результат.

AlexeyGfi
GROUPS уже есть в сущности. Просто делаем выборку....

аа, там же через это как раз и есть доступ (new OneToMany('GROUPS', UserGroupTable::class, 'USER')) ->configureJoinType(Entity\Query\Join::TYPE_INNER), тогда достаточно будет фильтрацию прописать по GROUPS.GROUP_ID, верно?

AlexeyGfi
Вам если я правильно слежу нужно where not in

Так. Может еще подскажете. Так как там у групп INNER JOIN, то все удваивается, а если добавлять 'group' ключ, то все поля прпадают в группировку и ничего не группируется. вопрос - как сгруппировать результат так, чтобы он выводился корректно?

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта