1;
while (true) {
$arRes = \CUser::GetList(
$by = "ID",
['id' => 'desc'],
['>ID' => 0],
['SELECT' => ['*', 'UF_*'],
'NAV_PARAMS' => ['nPageSize' => 30, 'iNumPage' => $i]
]
);
$el = $arRes->Fetch();
if (empty($el)) { break; } else { echo $el['ID'] . "\n"; }
while ($el = $arRes->Fetch()) {
echo $el['ID'] . "\n";
}
++$i;
}
у меня всего 290 страниц, и $i становится больше последней страницы Bitrix выдаёт первую, почему ? нужно както по другому выборку делать ?
Что то странное делаете, зачем вам постраничная навигация в этом запросе? уберите её и while, получите одним запросом всех пользователей
Сейчас у меня 290 пользователей, станет 1 000 000 , мне просто памяти нехватит всех достать сразу
это всё равно странное решение, время загрузки страницы тогда будет минут 10
новый ORM D7 тоже? UserTable может UF так же вытаскивать.
а он и не писал ничего про загрузку страницы, может это скрипт фоновый
Запросы в цикле, это где такому учат?
Тогда нужно за одну итерацию одну пачку обрабатывать, а не весь миллион
ну он это я так понимаю и хочет сделать 🤔
Открою тайну: не всегда запросы в цикле - зло 😁
Откройте мне истину, как должно быть ?
Одним запросом выбираешь коллекцию, потом в цикле делаешь что тебе надо
$users = UserTable::query() ->addSelect('ID') ->addSelect('UF_ESIA_DATA') ->whereNotNull('UF_ESIA_DATA') ->addOrder('ID', 'DESC') ->fetchCollection();
У меня вопрос был вытаскивать по 30 и чтобы страницы , после последней не возвращали бесконечно первую , как это сделать ?
Несовсем понимаю в чём отличие от $arRes = \CUser::GetList( $by = "ID", ['id' => 'desc'], ['>ID' => 0], ['SELECT' => ['*', 'UF_*'], 'NAV_PARAMS' => ['nPageSize' => 30, 'iNumPage' => $i] ] ); ? просто написано по другому
Отличие в том, что выбираются сразу все записи без постранички и берутся только необходимые столбцы. При малом количестве памяти сервера и очень большом количестве юзеров запуск такой выборки может привести к ошибкам нехватки памяти. Короче материал к изучению https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=5753&LESSON_PATH=3913.3516.5748.5063.5753 Смотреть в limit, offset и select. Метод \Bitrix\Main\UserTable::getList(...)
В твоём примере fetchCollection() также вытаскивает все записи, проверял по занимаемой памяти , поэтому я и спользовал пагинацию чтобы сделать ограничение 'NAV_PARAMS' => ['nPageSize' => 30, 'iNumPage' => $i]
это не мой пример
гугл: битрикс orm d7 постраничная навигация
Обсуждают сегодня