Олег

Олег

Был в сети 09 января 2022, 15:35
Заказы не принимаю
Автор, окстись!
Очень плохой код.

Как это сейчас работает: сначала через getCollection забираются 2000+ ресурсов, которые опубликованы. Далее мы получаем их id и для каждого делаем запрос к бд!
Это очень плохая идея.
Как минимум те же id можно получить через newQuery — так будет быстрее.
А во вторых желательно сделать 1 запрос к бд, а не 2001.

Почитай мануалы.

А вообще я бы примерно так сделал (вообще не гарантирую, что будет работать, пишу на глазок).
$mounth = 2629743;
$date = strtotime('now')-$mounth;
$where = array(
	'parent' => 19,
	'publishedon:<' => $date,
	'comments:>' => 20
	//тут надо добавить что-то про hits, но для этого сделать join таблицы modTemplateVar
);

$q = $modx->newQuery('modResource', $id);
$q->leftJoin('TicketThread','TicketThread', "`TicketThread`.`name` = 'resource-{$id}'");
$q->leftJoin('TicketComment','TicketComment', "`TicketThread`.`id` = `TicketComment`.`thread`");
$q->select('COUNT(`TicketComment`.`id`) as `comments`');
$q->where($where);

if ($q->prepare() && $q->stmt->execute()) {
    	$data = $q->stmt->fetch(PDO::FETCH_COLUMN);
	foreach ($data as $res) {
		//тут код вывода
	}
}
Вариант такого типа будет работать в сотни раз быстрее
Вы путаете, newQuery — это создание запроса xPDOQuery, а getCollection и getIterator получение результата на основании параметров (это может быть и обычный массив и xPDOQuery)

В случае getCollection и getIterator вы получаете объекты xpdo, из которых вы можете получить подготовленные данные через метод get.
Как я понял — объекты не нужно получать, ведь там просто вывод результатов.

Я вчитался в код и офигел… Сначала выбираются минимум 2000 страниц, после чего для каждой из них идет запрос к базе.

Да, тут вообще вопрос в другом — как избавится от такого количества запросов.