ORM Битрикс (D7): быстрое получение количества элементов выборки без дополнительных запросов

16.05.2019
Вся магия в директиве SQL_CALC_FOUND_ROWS и функции SQL_CALC_FOUND_ROWS(), которая выдает количество записей предыдущего запроса с директивой, без учета установленного лимита. В итоге можем получить записи нужной нам сущности и организовать постраничную навигацию БЕЗ использования двух запросов: запрос количества, потом запрос записей. Директива SQL_CALC_FOUND_ROWS работает только в MySQL.
$params = array(
	'filter' => array(
		'ACTIVE' => 'Y',
		'>DATE_CREATE' => \Bitrix\Main\Type\DateTime::createFromTimestamp(time() - 86400))
	),
	'select' => array(
		new \Bitrix\Main\Entity\ExpressionField('FOUND_ROWS', 'SQL_CALC_FOUND_ROWS %s','ID'),
		'ID',
		'NAME',
	),
	'order' => array('ID'=>'asc'),
	'limit' => 10,
);

$rs = \Bitrix\Iblock\IblockElementTable::getList($params)->fetchAll();
$totalCount = 0;
if ($resultTotal = \Bitrix\Main\Application::getConnection()->queryScalar('SELECT FOUND_ROWS() as TOTAL'))
{ // более быстрое получение количества строк
	$totalCount = $resultTotal;
}

← Вернуться к списку заметок