Полный цикл в digital

Агрегатные функции запроса ORM

Работать будем с тремя тестовыми таблицами, которые можно создать и заполнить SQL запросом:

-- создаем базу данных 
CREATE DATABASE IF NOT EXISTS `название_базы`
USE `название_базы`;
-- дамп структуры для таблица CITY
CREATE TABLE IF NOT EXISTS `CITY` (
`id` int(7) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`city_type_id` int(7) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-- дамп данных таблицы CITY
INSERT INTO `CITY` (`id`, `name`, `city_type_id`) VALUES
(1, 'Москва', 8),
(2, 'Санкт-Петербург', 8),
(3, 'Уфа', 8),
(4, 'Домодедово', 5),
(5, 'Сарапул', 5),
(6, ' Циолковский', 2);
-- дамп структуры для таблица CITYZEN
CREATE TABLE IF NOT EXISTS `CITYZEN` (
`id` int(7) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`city_id` int(7) NOT NULL,
`responsible` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='citizen';
-- дамп данных таблицы CITYZEN
INSERT INTO `CITYZEN` (`id`, `name`, `city_id`, `responsible`) VALUES
(1, 'Маша', 1, 1),
(2, 'Гриша', 2, 0),
(3, 'Даша', 1, 1),
(4, 'Коля', 3, 0),
(5, 'Дима', 4, 1),
(6, 'Вика', 4, 1),
(7, 'Люба', 5, 1),
(8, 'Кирилл', 3, 0),
(9, 'Анатолий', 3, 1),
(10, 'Вова', 4, 0),
(11, 'Витя', 4, 1);
-- дамп структуры для таблица CITY_TYPE
CREATE TABLE IF NOT EXISTS `CITY_TYPE` (
`id` int(7) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='city_type';
-- дамп данных таблицы CITY_TYPE
/*!40000 ALTER TABLE `CITY_TYPE` DISABLE KEYS */;
INSERT INTO `CITY_TYPE` (`id`, `name`) VALUES
(1, 'самые малы'),
(2, 'малые'),
(3, 'полусредни'),
(4, 'полусредни'),
(5, 'средние'),
(6, 'крупные'),
(7, 'крупнейшие'),
(8, 'Города-миллионеры');

На их основе я сгенерировал три ORM-класса: CityzenTable, CityTable и CityTypeTable, на основе этой инструкции и добавил в автозагрузку классов на основе этой инструкции.

Задача

На основе таблицы CITYZEN, получить количество всех граждан из города Уфа, этот город имеет id 3:

// сущность основной таблицы
$query = new \Bitrix\Main\Entity\Query(
    lib\CityzenTable::getEntity()
);
// регистрируем новое временное поле для исходной сущности
$query->registerRuntimeField(
    "CNT",
    [
        // тип вычисляемого поля
        "data_type" => "integer",
        // агрегатная функция (COUNT, MAX, MIN, SUM, AVG) и поле для подстановки
        "expression" => [
            "count(id)"
        ]
    ]
);
// секция селект
$query->setSelect([
    'CNT'
]);
// секция фильтр
$query->setFilter([
    'city_id' => 3,
]);
// выполняем запрос
$result = $query->exec();
// распечатка массива
pp($result->fetch());
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг