Справка
Оператор [find] - Выбрать объекты
Аргументы:
- Игнорировать родителя
(логический, флаг ignore_owner)
- Проверять доступы
(логический, флаг check_auth)
- Подтаблица
(название подтаблицы)
- Условия поиска
(строка/число)
Возможные значения:
- : Нет;
- ignore_ex : Игнорировать экземпляр таблицы;
- ignore_module : Игнорировать модуль;
- Какие объекты возвращать
(строка/число)
Возможные значения:
- : Активные;
- disabled : Не активные;
- all : Все;
- Дополнительные условия
(строка/число)
Возможные значения:
- : Нет;
- return_owners : Вернуть родителей найденных объектов;
Результат: Массивы
[FIND] - группа команд, позволяющих осуществить поиск объектов в базе данных по группе критериев, их сортировку и обрезку.
Поскольку операции происходят непосредственно в базе данных, такой вариант поиска (в отличие от оператора массива [sel]) позволяет значительно экономить трафик между базой данных и сервером, оперативную память сервера и процессорное время. Единственное исключение - проверка доступов (флаг [check_auth]) произойдёт после выборки.
Существует несколько вариаций данной команды. Она может быть вызвана из таблицы/подтаблицы либо из массива данных. В первом случае отправной точкой станут все объекты таблицы, во втором - только те элементы, которые присутствуют в исходном массиве.
Кроме этого команда может возвращать не только набор элементов, но и их количество (оператор [find_count]).
Также команда может выдать ссылку на выборку в БД (что позволит в некоторых случаях сэкономить ОЗУ сервера) - [find_pointer]. Данная ссылка будет работать в связке с оператором перебора [tree], однако с ней нельзя работать как с обычным массивом.
[FIND] - первая команда из группы. Инициализирует поиск, настраивает его параметры.
Настройка [FIND] может выглядеть следующим образом:
[cex.category.find(subtable=articles, disabled, return_owners)]
Что будет означать - выбрать из таблицы "Категории" все деактивированные статьи, игнорируя их родителя, а затем выдать их категории.
Данный код (включая последующие операторы) полностью генерируется с помощью визуального редактора вставки.
После команды [FIND] можно задать условия для поиска, а также настройку сортировки и обрезки. Для этого существуют команды [where], [where_set], [sort], [limit], [start] и [if].
Команда [WHERE] позволяет задать условие для поиска.
Несколько команд [where] (без использования [where_set]) объединяются по принципу AND (логическое И).
Команда состоит из следующих аргументов:
Виды операций сравнения:
Виды мутаторов переменной:
Зарезервированные названия для переменных (данный перечень также работает для сортировки):
Команда [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] является префексом для любой команды. Если условие из неё не выполняется, то следующая за ней команда игнорируется.
Пример работы с методом [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.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] условиях:
Затем будет пропущена первая статья ([start(2)]).
[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 дней
Затем будет пропущена первая статья ([start(2)]).
Пример работы с методом [FIND] через визуальный редактор можно найти во второй половине этого видео