MODX. &where, примеры записей условий для выборки

Различия записей в языках:

SQL: WHERE width = 15

MODX: &where=`width = 15`

JSON: &where = `{ "width":15 }`

xPDO: $query->where(array('width' => 15));

inSnippet: 'where' => '{"width":15}'

или 'where' => [ 'width' => 15]

Ссылка на оффициальную документацию

Множественный выбор с условиями

MODX: &where=`width = 15 OR width = 25`

xPDO: $query->where(array(array( 'width' => 15), array('OR:width:=' => 25)));

JSON: { "0": { "width :=":"15","AND:height:=":"10" },"OR:width :=":"25" }

inSnippet, php: 'where' => [ 'width' => 15, 'OR:width:=' => 25 ]

Доступные операторы

  Символ Пример xPDO Пример MODX
Равно   'width' => 15 `width = 15`
= 'width:=' => 15  
Равно (безопасное сравнение значения NULL) <=>    
Не равно != 'width:!=' => 15 `width != 15`
<>    
Меньше > 'width:>' => 15 `width > 15`
Больше < 'width:<' => 15 `width < 15`
Больше или равно >= 'width:>=' => 15 `width >= 15`
Меньше или равно <= 'width:<=' => 15 `width <= 15`
Равно LIKE 'width:LIKE' => '%15%' `width  LIKE %15%`
Не равно NOT LIKE 'width:NOT LIKE' => '%15%' `width  NOT LIKE %15%`
В массиве IN 'width:IN' => array(15,16,17,20)  
Не в массиве NOT IN 'width:NOT IN' => array(15,16,17,20)  
  NOT   `width NOT 15 `
Если Null IS  'width:IS' => null `width IS null`
IS NULL   `width IS NULL `
Если Not Null IS NOT NULL   `width IS NOT NULL`
Между BETWEEN     
Включает EXISTS     
Не включает NOT EXISTS    
Соединяется COALESCE    
Интервал INTERVAL    
Наибольшее GREATEST    
Наименьшее LEAST    
Совпадает MATCH    
Максимум MAX    
Минимум MIN    
В среднем AVG    
Или OR

array( 'width' => 15), 

array('OR:width:=' => 10)

 
И AND

array( 'width' => 15), 

array('AND:height:=' => 10)

 

Теги MODX

[[pdoResources? 
     &where = `published=1,deleted=0,createdby=12`
     ...
]]

Для сложных конструкций можно использовать чанк, сниппет или плейсхолдер вместо строки:

[[pdoResources? 
     &where=`[[CalculatedWhere]]` 
     ...
]]

пример такого сниппета:

$where = array(
    'published' => 1,
    'deleted' => 0,
    'createdby' => $modx->user->get('id'),
);
return $modx->toJSON($where);

Json

Обратите внимание, что при использовании JSON записи одновременно с шаблонизатором Fenom, после фигурных скобок надо проставлять пробелы. Иначе запись может вызвать ошибку в логах, несмотря на то что код будет обработан правильно.

[[pdoResources? 
     &where = `{ "published":1,"deleted":0,"createdby":12 }`
     ...
]]

Использование плейсхолдеров

Плейсхолдеры должны формироваться до вызова ресурсов. К примеру сниппет SetWhere формирующий плейсхолдер:

$jsonString = $modx->toJSON($input);
$modx->setPlaceholder('CalculatedWhere', $jsonString);

Вызов сниппетов

[[SetWhere? 
   &input=`month=January,year=2015`
]]

[[pdoResources? 
   &where=`[[+CalculatedWhere]]` 
   ...
]]

Несколько вызовов на странице можно сформировать добавив дополнительный параметр. Формирование плейсхолдера:

$placeholderName = $scriptProperties['ph']
// ...
 
$modx->setPlaceholder($placeholderName, $value);

Вызов на странице:

[[SetWhere? 
   $month=`January` 
   &year=`2015 
   &ph=`January`
]]

[[getResources? 
   &where=`[[+January]]` 
   ...
]]
 
...
 
[[SetWhere? 
   $month=`February` 
   &year=`2015 
   &ph=`February`
]]

[[getResources? 
   &where=`[[+February]]`
   ...
]]

Примеры

Получение всех ресурсов, опубликованных в течение определенного месяца того или иного года

[[getResources? 
    &where=`[[CalculatedWhere? &month=`January` &year=`2015`]]`
    ...
]]

Сниппет CalculatedWhere

$month = $scriptProperties['month'];
$year = $scriptProperties['year'];
$a_date = $month . ' ' . $year;
$min = strtotime($a_date);
$time = date("Y-m-t 23:59", $min);
$max =  strtotime($time);
 
$where = array(
    'publishedon:>=' => $min,
    'publishedon:<=' => $max,
);
 
return $modx->toJSON($where);


// будет сформирована JSON строка вида 
// {"publishedon:>=":1420092000,"publishedon:<=":1422770340}

Данные какого-либо плейсхолдера входят в массив

[[pdoResources? 
    &where = `[[+id]] IN (1,2,3,4,5)`
    ...
]]

php конструкция, формирующая запрос where

// опубликованные ресурсы, не являющиеся каталогом
$where = array( 'published' => 1, 'isfolder' => 0, );

// формирование were из GET данных
$filter = array();

if($_GET['tags']) {
 $filter[] = 'tags='.$_GET['tags'];
}

if($filter) {
 $where = $modx->toJSON(array($filter));
} else {
 $where = '';
}

$params = array(
 ...
 'where' => $where
);

where и оператор like в php

$arr = array (5,15,10,20);

$params = array(
...
'where' => [ 
              'field:LIKE' => '%'.$arr.'%',
              'field2:LIKE' => $arr.'%',
              'field3:LIKE' => '%'.$arr
           ],
...
);

$out = $modx->runSnippet('pdoPage', $params);

Возможные ошибки

  • Если после составления условия where в логах возникает ошибка «Error parsing condition with key 0», то вероятно неправильно составлены критерии выборки. 
?

Благодарю за ответ!

Была ли эта информация полезной?

Здравствуйте!

Позвольте представиться, меня зовут Марина. Более 10 лет я занимаюсь обслуживанием сайтов и развитием интернет проектов. Если вы хотите избавиться от хлопот связанных с созданием и поддержкой сайта, тогда вы попали по адресу. При работе с сайтами я предоставляю качественные услуги, ориентируясь на ваши индивидуальные потребности. Для связи со мной воспользуйтесь формой обратной связи.

Инсталента