Документация для разработчиков
Темная тема

ExpressionField

ExpressionField - класс описаний динамичных полей в виде:

Если имеется поле PRICE_USD  и нужно рассчитать цену в EUR, то определим поле PRICE_EUR с помощью выражения PRICE_EUR = array('%s * 1.25', 'PRICE_USD')

Расширение класса \Entity\Field.

Обращается к пространству имён:

Метод Описание С версии
Конструктор Конструктор класса


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Антон Якимов
Сообщение не промодерировано, возможны ошибки и неточности.
На данный момент (24 версия ядра) поддерживается только ограниченный список агрегатных функции.
Например JSON_ARRAYAGG не указана в массиве $aggrFunctionsMYSQL в Bitrix\Main\ORM\Fields\ExpressionField, из-за чего поле попадает в секцию Group и запрос выдаёт ошибку.
Список поддерживаемых агрегатных функций, к сожалению, не нашёл
0
Вячеслав Докукин
Сообщение не промодерировано, возможны ошибки и неточности.
Пример с вычисляемыми значениями секунд и минут, затраченного времени по каждой задаче пользователя
В модели (можно сгенерировать) для таблицы b_tasks_elapsed_time добавляем такие виртуальные вычисляемые поля MINUTES_SUMM SECONDS_SUMM
Код
class ElapsedTimeTable extends DataManager
{

public static function getTableName(){
    return 'b_tasks_elapsed_time';
}

// ... more fields

public static function getMap() 
{

(new ExpressionField(
    'MINUTES_SUMM',
    sprintf('(SEL ECT  SUM(`MINUTES`) AS `SUMMIN` FR OM %s WHERE `USER_ID` = %s AND `TASK_ID`=%s)',
        self::getTableName(),
        '%s',
        '%s',
    ),
    ['USER_ID', 'TASK_ID'],
    []
)),

(new ExpressionField(
    'SECONDS_SUMM',
    sprintf('(SEL ECT  SUM(`SECONDS`) AS `SUMSEC` FR OM %s WHERE `USER_ID` = %s AND `TASK_ID`=%s)',
        self::getTableName(),
        '%s',
        '%s',
    ),
    ['USER_ID', 'TASK_ID'],
    []
))
}
}

В ORM указываем что выбираем 2 виртуальных вычисляемых поля MINUTES_SUMM и SECONDS_SUMM и добавляем группировку по TASK_ID то бы записи не дублировались

Код
$id = \Bitrix\Main\Engine\CurrentUser::get()->getId();

$rows = ElapsedTimeTable::query()
    ->where('USER_ID', $id)
    ->setSelect(['USER_ID', 'TASK_ID', 'SECONDS_SUMM', 'MINUTES_SUMM'])
    ->setGroup('TASK_ID')
    ->fetchAll();

foreach ($rows as $row) {
    dump($row);
}
$rows будет сумма минут и секунд по каждой задаче пользователя
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх