Справка

Оператор [find] - Выбрать объекты

Ссылка на оператор в списке

Аргументы:
- Игнорировать родителя (логический, флаг ignore_owner)
- Проверять доступы (логический, флаг check_auth)
- Подтаблица (название подтаблицы)
- Условия поиска (строка/число)
Возможные значения:
  - : Нет;
  - ignore_ex : Игнорировать экземпляр таблицы;
  - ignore_module : Игнорировать модуль;
- Какие объекты возвращать (строка/число)
Возможные значения:
  - : Активные;
  - disabled : Не активные;
  - all : Все;
- Дополнительные условия (строка/число)
Возможные значения:
  - : Нет;
  - return_owners : Вернуть родителей найденных объектов;

Результат: Массивы

[FIND] - группа команд, позволяющих осуществить поиск объектов в базе данных по группе критериев, их сортировку и обрезку.

Поскольку операции происходят непосредственно в базе данных, такой вариант поиска (в отличие от оператора массива [sel]) позволяет значительно экономить трафик между базой данных и сервером, оперативную память сервера и процессорное время. Единственное исключение - проверка доступов (флаг [check_auth]) произойдёт после выборки.

Существует несколько вариаций данной команды. Она может быть вызвана из таблицы/подтаблицы либо из массива данных. В первом случае отправной точкой станут все объекты таблицы, во втором - только те элементы, которые присутствуют в исходном массиве.

Кроме этого команда может возвращать не только набор элементов, но и их количество (оператор [find_count]).

Также команда может выдать ссылку на выборку в БД (что позволит в некоторых случаях сэкономить ОЗУ сервера) - [find_pointer]. Данная ссылка будет работать в связке с оператором перебора [tree], однако с ней нельзя работать как с обычным массивом.

[FIND] - первая команда из группы.  Инициализирует поиск, настраивает его параметры.
  • Флаг "Игнорировать родителя" позволяет проводить поиск по дочерним объектам.
  • Флаг "Проверять доступы" осуществит проверку на возможность просмотра объектов текущим пользователем. В конечной выборке будут присутствовать только те объекты, которые прошли эту проверку. Аналогичного результата можно добиться, если подставить после цепочки команду [arows]
  • Опция "Условия поиска". Позволяет игнорировать экземпляр таблицы, в которой происходит  поиск ([ignore_ex]), или же вовсе игнорировать модуль ([ignore_module]).
    Например, опцию [ignore_ex] мы можем использовать, если нам нужно найти все статьи, даже те, которые находятся в качестве дочерних объектов в категориях (т.е. совсем в другой таблице).
    Пример: [cex.articles.find(ignore_ex)]
  • Опция "Какие объекты возвращает" предлагает провести поиск только среди активных/неактивных, либо среди всех объектов
  • Опция "Дополнительные условия" позволяет вернуть массив родителей объектов.
  • Опция "Подтаблица" позволит работать со всеми подобъектами из указанной подтаблицы.

Настройка [FIND] может выглядеть следующим образом:
[cex.category.find(subtable=articles, disabled, return_owners)]
Что будет означать - выбрать из таблицы "Категории" все деактивированные статьи, игнорируя их родителя, а затем выдать их категории.
Данный код (включая последующие операторы) полностью генерируется с помощью визуального редактора вставки.

После команды [FIND] можно задать условия для поиска, а также настройку сортировки и обрезки. Для этого существуют команды [where], [where_set], [sort], [limit], [start] и [if].

Команда [WHERE] позволяет задать условие для поиска.
Несколько команд [where] (без использования [where_set]) объединяются по принципу AND (логическое И).

Команда состоит из следующих аргументов:
  • Переменная объекта, по которой будет происходить сверка
  • Операция сравнения (см.ниже)
  • Значение (то, с чем будет сравниваться переменная, если это необходимо)
  • Мутатор переменной объекта (см.ниже)

Виды операций сравнения:
  • Стандартные ==, !=, <, >, <=, >=
  • contain - проверяет, содержит ли переменная значение
  • not_contain - проверяет, что переменная не содержит значение
  • contained - проверяет, содержит ли значение переменную
  • not_contained - проверяет, что значение не содержит переменной
  • in_array - проверяет, содержится ли переменная в массиве значений
  • not_in_array - проверяет, что переменная не содержится в массиве значений
  • empty - переменная пустая (значение в этом случае можно не указывать)
  • not_empty - переменная не пустая (также можно не указывать значение)

Виды мутаторов переменной:
  • mutate_lower - приводит переменную объекта в нижний регистр перед сверкой с значением (может не работать на некоторых СУБД с кириллическими текстами)
  • mutate_length - сравнивает со значением длину переменной
  • mutate_value - сравнивает с значением другого поля текущего объекта (в этом случае, в поле "Значение" заполняется sname нужного для сравнения поля)

Зарезервированные названия для переменных (данный перечень также работает для сортировки):
  • id - идентификатор объекта
  • pos - позиция объекта в административном кабинете
  • owner/own - ID родителя объекта
  • user/usr - главный владелец (пользователь) объекта
  • major - главная переменная объекта
  • creation_date - дата создания объекта
  • modified_date - дата модификации объекта

Команда [WHERE_SET] позволяет задать группировку нескольких условий where, объединённых с помощью AND или OR (логическое и / или). Группировка может быть сколь угодно вложенная (т.е. вместо условия where в группировку можно вставить команду where_set).
Первый аргумент [where_set] определяет тип проверки 'or' или 'and', все последующие аргументы делятся на условия и группы условий.

Команда [SORT] позволяет указать переменную, по которой произойдёт сортировка и тип сортировки. Если тип не указывать, произойдёт сортировка по возрастанию. Также можно указать тип DESC (по уменьшению), RAND (случайным образом).

Для сортировки по множеству переменных укажите несколько операторов [SORT], идущих друг за другом. Приоритеты сортировки будут аналогичны порядку команд [SORT].

Вместо названия переменной можно указать одно из зарезервированных значений - id, pos, owner, user, major и т.д. (см. выше).

Команда [START] позволяет пропустить некоторые объекты от начала выборки. Например, [start(10)] пропустит первые 9 элементов.

Команда [LIMIT] ограничивает выборку указанным количеством.

Команда [IF] является префексом для любой команды. Если условие из неё не выполняется, то следующая за ней команда игнорируется.

Примеры

Выберем страницы:

[cex.pages.find.where('title', contain, 'контакты', mutate_lower).if($x==0).limit(5)]

Произойдёт выборка страниц, заголовки которых в нижнем регистре содержат слово "контакты". Если [$x==0], то произойдёт обрезка результата до 5 страниц.

Выберем статьи в категориях:

[cex.category.find(subtable='articles', ignore_owner).where_set('or',
  where('tags', '==', cex.tags.get('интересно')),
  where('owner', 'in_array', cex.category.find.where('title', contain, 'хорошо') ),
  if($x==1).where('creation_date', '<', glob.date.day(-10) )
) .sort('modified_date','desc') .if($x==0).sort('title').start(2)]


Выборка произойдёт во всех статьях из всех категорий. Затем выберутся только те статьи, которые подойдут под одно из указанных в [where_set] условиях:
  • Либо у статьи будет тег "Интересно"
  • Либо категория, в которой лежит статья будет содержать название "хорошо"
  • Либо (если [$x==1]) если дата создания меньше текущей на 10 дней
Затем полученные статьи отсортируются по дате модификации (по убыванию), а статьи с одинаковой датой отсортируются внутри этой даты по заголовку (по возрастанию), но только если переменная [$x==0].
Затем будет пропущена первая статья ([start(2)]).


Пример работы с методом [FIND] через визуальный редактор можно найти во второй половине этого видео