Фильтр для DocLister
по TV типа multiTV
, формат записи фильтра:
multitv:tvname:operator:name|value
Описание фильтра:
название | описание |
---|---|
multitv |
фильтр по multiTV |
tvname |
название tv |
operator |
как сравнивать |
name |
поле name для поиска |
value |
значение value для поиска |
Поиск реализован с помощью функций MySQL, список ниже:
функция | версия MySQL |
---|---|
JSON_SEARCH |
от 5.7 |
JSON_EXTRACT |
от 5.7 |
JSON_TABLE |
от 8.4 |
Для каждого оператора указано какая минимальная версия MySQL требуется.
Оператор | Описание | версия mysql |
---|---|---|
= , eq , is |
равно, точное совпадение | 5.7 |
!= , no , isnot |
нет совпадений | 5.7 |
isnull |
нет никакого значения | 5.7 |
isnotnull |
есть какое-тор значение | 5.7 |
> , gt |
больше | 8.4 |
< , lt |
меньше | 8.4 |
<= , elt |
меньше или равно | 8.4 |
>= , egt |
больше или равно | 8.4 |
% , like |
содержит строку | 5.7 |
like-r |
начинается строкой | 5.7 |
like-l |
заканчивается строкой | 5.7 |
сontainsOne |
содержит хотя бы одно значение как часть строки | 5.7 |
сontainsAll |
содержит все значения как часть строки | 5.7 |
in |
значение строки равно одному из значений | 5.7 |
notin |
значение строки не равно ни одному из значений | 5.7 |
Хранение значений в multiTV
сделано в виде массива объектов, а значения полей всегда хранится как строка, например для поля name = 10
хранится в json как "name": "10"
, а всё вместе выглядит так:
{
"fieldValue": [
{ "name": "value1" },
{ "name": "value2" },
{ "name": "value3" }
],
"fieldSettings": {
"autoincrement": 1
}
}
Из этого выходит ряд особенностей при поиске:
Формат: multitv:tvname:is:fieldname|fieldvalue
Ищет, что в массиве по полю fieldname
есть хотя бы одно значение fieldvalue
по указанным правилам сравнения.
Значения сравниваются как строки, то есть 10
и 10.0
это разные значения.
Например multitv:price:is:100
не найдёт ничего, если значение указано как 100.0
и наоборот.
Формат: multitv:tvname:isnull:fieldname|fieldvalue
Проверяется отсутствие любого значения у fieldname
для isnull
или наличие хоть какого-то значения у fieldname
для isnotnull
.
Формат: multitv:tvname:gt:fieldname|fieldvalue
Ищет, что в массиве по полю fieldname
есть хотя бы одно значение fieldvalue
и подходит под сравнение как число.
При поиске значения в базе и в фильтре приводятся к float
.
Поиск по правилам LIKE
в MySQL.
Формат: multitv:tvname:like:fieldname|fieldvalue
Ищет, что в массиве по полю fieldname
есть строка fieldvalue
, сопадающая по правилам LIKE
.
Формат: multitv:tvname:containsOne:fieldname|val1,val2,val3
сontainsOne
содержит хотя бы одно значение как часть строкисontainsAll
содержит все значения как часть строки
Ищет, что в массиве по полю fieldname
содержится строка, совпадающая по правилам LIKE
для выбранного оператора.
Формат: multitv:tvname:in:field|val1,val2,val3
in
значение строки равно одному из значенийnotin
значение строки не равно ни одному из значений
Ищет, что в массиве по полю fieldname
содержится строка, совпадающая для выбранного оператора.
Например, есть tv
типа multiTV
под названием product_code
, в которой содержится массив из нескольких code
.
Тогда значение для multiTV
будет иметь вид:
{
"fieldValue": [
{ "code": "value1" },
{ "code": "value2" },
{ "code": "value3" }
],
"fieldSettings": {
"autoincrement": 1
}
}
Найти все ресурсы, у которых в tv
названной product_code
в поле code
есть value2
:
multitv:product_code:is:code|value2