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`
У меня такой вопрос
Есть вывод ресурсов
[[pdoResources? &parents=`[[++locations_plans]]` &tpl=`@INLINE <a href="[[+alias]]">[[+menutitle]]</a>` &tvPrefix=`` &where=`{"city:=":"Санкт–Петербург","template:=":3}` &includeTVs=`city` ]]так вот гдеcity:=":«Санкт–Петербург
в Санкт-Петербург приходится использовать тире, если ставить там „-“ (минус)
ничего не работает
как научить where корректно обрабатывать знак минус?
заэкранировать его както или что?