8 (800) 302-62-68
+7 (499) 348-29-58
sale@rbs-crm.ru

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

РосБизнесСофт CRM > База знаний > Разработчикам > Работа с выборкой объектов

Работа с выборкой объектов

За работу с выборкой Объектов отвечает класс EntrySet.

Объект EntrySet представляет собой набор записей одного типа. Можно рассматривать объект этого класса, как содержимое таблицы или как массив данных.

С объектом можно совершать следующие операции:

  • Фильтровать объекты (поиск)
  • Ограничивать выборку объектов
  • Сортировать выборку объектов
  • Применять математические функции в выборке объектов
  • и т.д.

filter($string)

Используется для поиска Объектов.

Где:

  • string — Строка с правилом фильтрации.

Строка строится по принципу: {ПОЛЕ}{ОПЕРАЦИЯ}{ЗНАЧЕНИЕ}.

Операции могут быть:

  • =
  • !=
  • >
  • <
  • >=
  • <=
  • like
  • contains
  • between (для полей типа «Дата». См. пример ниже.)
Условие «И»

При последовательном написании «filter» накладывается условие «AND» (И).

Пример:

$_data = $this->Data->References->Companies; //Получаем список всех "Контрагентов"
$_data->filter("id!=5"); //Убираем из него компанию с id=5
$_data->filter("date>=22-05-2012"); //Оставляем только созданные после 22 мая
$_data->filter("status=1"); //И только со статусом 1 
$_data->filter("pasport_data between '2017-11-15' and '2017-12-21'"); //between от 2017-11-15 до 2017-12-21. Можно использовать не только с датами.

Или можно так:

$_data = $this->Data->References->Companies->filter("id!=5")->filter("date>=22-05-2012")->filter("status=1");

Каждый вызов filter изменяет данные в наборе. При этом в переменной хранится только ссылка на набор данных, поэтому каждый следующий выбор уточняет набор.
В результате выполнения кода выше, в $_data будут перечислены все компании со «Статусом»=1, созданные после «22 мая», кроме компании с «id» !=5.

Пример: отфильтруем «Счета» за определенный период и по текущему пользователю системы:

$orders = $this->Data->{'documents.orders'}
    ->filter('responsible=' . $this->User->getEmployeeId())
    ->filter('date>=' . date('2022-01-01'))
    ->filter('date<' . date('2023-01-01'));

Если мы находимся в «Форме списка» модуля «Счет», то можно применить фильтрацию следующим способом:

$this->structure
    ->filter('responsible=' . $this->User->getEmployeeId())
    ->filter('date>=' . date('2020-01-01'))
    ->filter('date<' . date('2021-01-01'));

В structure хранятся элементы текущего объекта (все «Счета»).

Если нужно отфильтровать Объекты по полю типа «Дата», которое пока не заполнено, то используется следующая конструкция:

$projects = Kernel::Data()->{'positions.table_83'}->filter("date_end=NULL");

Пример использования like в фильтре для поиска по части строки:

$this->structure->filter("name like %". $filter_name ."%");
Условие «ИЛИ»

Если в фильтре перечислить несколько условий (массивом), то условие будет уже «OR» (логическое «ИЛИ»)

Пример: получить задачи текущего пользователя со статусом «Новый» или «В работе»:

$this->data->{"documents.tasks"}
->filter(["status=1", "status=2"]) //  1 = Новые, 2 = В работе
->responsible($this->User->getEmployeeId());

Пример: отфильтруем Задачи, где поле «Автор» = текущий пользователь или поле «name» табличной части «responsible» = текущему пользователю

$_data->filter(["author=" . $this->User->getEmployeeId(), "responsible contains name=" . $this->User->getEmployeeId()]);
Фильтр по полю типа «Multipointer»

Для типа поля «Multipointer» (множественный выбор) существуем метод «contain» для фильтрации.

Например, у объекта “Контрагент” есть поле с множественным выбором «Сегменты» (segments).

Задача: Отобрать «Контрагентов» только с выбранным  «Сегментом А»

$companies = $this->Data->{'references.companies}->filter('segments contains 777')

Где:

  • 777 — ID объекта «Сегмент А».

order($field)

Для сортировки Объектов в выборке применяется метод order().

Где:

  • field — поле Объекта или массив из поля и вида спортивки (ASC, DESC)

Если нужна сортировка A-Z, то необходимо указать только название поля, по которому необходимо отсортировать.

Например, получим «Счета» в порядке возрастания «Даты»:

$this->Data->{"documents.orders"}->order("date");

Для сортировки Z-А необходимо передать массив в метод order().

Пример: получить «Счета» в порядке убывания «Даты» («свежие» счета будут в начале списка):

$this->Data->{"documents.orders"}->order(["date", DESC])

limit($lim, $startFrom)

Ограничения выборки.

Где:

  • lim — количество Объектов
  • startFrom — Отсчитывать объекты, начиная «С». Поле необязательное.

Пример: отобрать первые 10 контрагентов, удовлетворяющие фильтрам

$this->companies = $this->Data->References->Companies->filter(["name like %" . $search . "%", "phone like %" . $search . "%", "email like %" . $search . "%", "id=" . $search . "%"])->limit(10);

num ($countOnly)

Получение количества объектов в выборке.

Где:

  • countOnly — только подсчитать (синхронизации с базой не происходит).

Пример: получить количество записей в табличной части «products»

$this->structure->products->num()

sum ($field)

Сумма по полю в выборке.

Где:

  • field — название поля

Пример: найти сумму стоимости всех товарах в табличной части

echo $this->structure->products->sum("total"));
// 7777