WHERE в proResouces, msProducts
Примеры использования в pdoTools
&where=`{"parent=":75}`
&where=`{"parent":75}`
— Выбрать ресурсы по паренту. Эквивалентно&parents=`75`
(если не указан никакой знак, то по умолчанию это=
)&where=`{"template:IN":[1,2,3]}`
— Выборка по массиву значений. (Только ресурсы некоторых шаблонов)&where=`{"parent:NOT IN":[75,147,80]}`
— Выборка за исключением массива значений. (Ресурсы, кроме тех, у которых родителем является 75,147,80)&where=`{"Data.old_price:>":0}`
— Условие "больше чем". (Товары, у которых указана старая цена)&where=`{"Data.old_price:<=":1000}`
— Условие "меньше или равно"&where=`{"uri:LIKE":"%games%"}`
— УсловиеWHERE LIKE
(содержит подстроку "games")&where=`{"uri:NOT LIKE":"games%"}`
— УсловиеWHERE NOT LIKE
(подстрока не начинается на "games")&where=`{"uri:LIKE":"%games"}`
— УсловиеWHERE LIKE
(содержит подстроку "games", которая находится в конце строки)- Условия AND, OR
&where=`{"article:LIKE":"PGS_%","Data.price:<":500}`
— УсловиеAND
(article начинается на "PGS_" и цена больше 500)&where=`{"parent":4,"OR:template":5}`
— УсловиеOR
&optionFilters, NOT IN
Выборка товаров по опциям
Входные данные:
- Опции товара
exist
(тип «Выпадающий список»), в которой указывается статус наличия/доставки
Задача
- Сделать выборку по тем товарам, у которых НЕ указаны статусы "Нет в наличии" и "Только самовывоз"
[[!msProducts? &parents=`0` &depth=`10` &limit=`0` &tpl=`yml_offer` &optionFilters=`{"exist:NOT IN":[ "Нет в наличии", "Только самовывоз" ]}` ]]
&innerJoin, msProductOption
Выбрать товары по диапазону дат, указанных в опциях
Входные данные:
- Опции товара
yml_promo_start
иyml_promo_end
, форматаДата
(2018-10-24)
Задача
- Выбрать товары, у которых указанная дата начала акции
yml_promo_start
больше или равна текущей даты, аyml_promo_end
меньше или равна текущей дате.
Как это сделать через &optionFilters
я не понял (пожалуйста, напишите в комментариях если вы знаете решение). Но через &innerJoin
вполне:
(Соответствие названия классов с названиями таблиц в MySQL)
[[!msProducts? &parents=`0` &depth=`10` &limit=`0` &tpl=`yml_promo` &innerJoin=`{ "option1": { "class": "msProductOption", "on": "option1.key = 'yml_promo_end' AND option1.product_id = msProduct.id AND option1.value != 0 AND option1.value >= now()" }, "option2": { "class": "msProductOption", "on": "option2.key = 'yml_promo_start' AND option2.product_id = msProduct.id AND option2.value != 0 AND option2.value <= now()" } }` ]]
&tvFilters
Выборка по доп. полям (TV-полям)
Теория (примеры ниже)
Соответсвие операторов, используемых в &tvFilters
с операторами SQL. Найдены внутри метода addTVFilters
в файле core/components/pdotools/model/pdotools/pdofetch.class.php
Кому-то эта информация покажется избыточной, но я думаю, что это следует знать, чтобы четко понимать во что преобразается написанный вами запрос, и соответсвенно лучше контролировать результат.
Слева указан вид, который пишем при вызове сниппета, справа — то, что получается при формировании запроса. В примерах преобразования показано как это происходит. (Вы легко сможете повторить эти эксперементы, запустив сниппет с параметром &showLog=`1`)
<=>
=><=>
-
===
=>=
Примеры преобразования:
&tvFilters=`mytvname===Lorem ipsum dolor sit amet`
`TVmytvname`.`value` = 'Lorem ipsum dolor sit amet'
!==
=>!=
<>
=><>
-
==
=>LIKE
Примеры преобразования:
&tvFilters=`mytvname==Lorem ipsum dolor sit amet`
`TVmytvname`.`value` LIKE 'Lorem ipsum dolor sit amet'
Еще один пример:
&tvFilters=`mytvname==%Lorem%`
`TVmytvname`.`value` LIKE '%Lorem%'
-
!=
=>NOT LIKE
Примеры преобразования:
&tvFilters=`mytvname!=%Lorem%`
`TVmytvname`.`value` NOT LIKE '%Lorem%'
<<
=><
<=
=><=
=<
=>=<
>>
=>>
>=
=>>=
=>
=>=>
Примеры использования &tvFilters
Вывести только ресурсы, у которых ТВ important-page
(тип «чекбокс») отмечен
&tvFilters=`important-page==1`
У меня такой вопрос
Есть вывод ресурсов
так вот где
city:=":«Санкт–Петербург
в Санкт-Петербург приходится использовать тире, если ставить там „-“ (минус)
ничего не работает
как научить where корректно обрабатывать знак минус?
заэкранировать его както или что?