Попробуйте другие шаблоны сайта
Подсказка: кнопка "Редактировать шаблон" находится в правом нижнем углу.

Множественный OR и AND в WHERE условии getResources / getProducts

В блоге Я негодую

Добрый день уважаемые! Третий день уже бьюсь над проблемой, все облазил и перелазил ничего не помогает: Имеется таблица MIGXDB с товарами из нее дергаются элементы через getProducts у которых стоит значение доступен = 1 (available = 1):
[[getProduct? &className=`ShopContent` &packageName=`shop` &limit=`[[!#get.limit:default=`12`]]` &parents=`7` &tpl=`catalogElement` &where=`{"available:=":"1"}`]]
Так все работает, но мне необходимо выбрать элементы которые если недоступны, то имеют значение toOrder = 1. Вобщем в mysql рабочий запрос простой и рабочий, вот такой:
SELECT * FROM `modx_shop_content` as m WHERE m.toOrder = 1 OR m.toOrder = 0 AND m.available = 1
Судя по оффициальной документации rtfm.modx.com/extras/revo/getresources:
&where=`{"template:=":1, "OR:template:=":2}`
исходя из этого, должен работать следующий код, но ни один не работает (пустая выборка):
&where=`{"toOrder:=":"1","OR:toOrder:=":"0","AND:available:=":"1"}' &where=`{"toOrder:=:OR":"1","toOrder:=:AND":"0","available:=":"1"}'
в логе пишет всегда с AND условиями почему непонятно:
SELECT DISTINCT `sc`.`id` FROM `modx_shop_content` `sc` WHERE ( ( `sc`.`resource_id` IN (7) ) AND (`sc`.`available` = :available04) AND (`sc`.`available` = :available05) AND (`sc`.`toOrder` = :toOrder06) )
Люди добрые может кто сталкивался подскажите где собака зарыта?
JSON прогоняется через $modx->fromJSON($json), на выходе получается массив условий, чтобы он был верно разобран нужно соблюдать определенные правила, об этом подробнее можно почитать тут rtfm.modx.com/xpdo/2.x/class-reference/xpdoquery/xpdoquery.where
Собственно все можете проверять в консоли modx.
$where = array( array( "available:="=>"0" ,"AND:toOrder:="=>"1" ) ,"OR:available:="=>"1" ); $c = $modx->newQuery('modResource'); $c->where($where); $c->select('id'); $c->prepare() echo $c->toSQL();
Вернет:
SELECT `id` FROM `modx_site_content` AS `modResource` WHERE ( ( `modResource`.`available` = '0' AND `modResource`.`toOrder` = '1' ) OR `modResource`.`available` = '1' )
А если сделать вот так:
echo $modx->toJSON($where);
получите вашу JSON строку:
{"0":{"available:=":"0","AND:toOrder:=":"1"},"OR:available:=":"1"}

Добавить комментарий