MODX. &where, примеры записей условий для выборки
Отредактировано: 03 Февраля 2023
Различия записей в языках:
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 лет я занимаюсь обслуживанием сайтов и развитием интернет проектов. Если вы хотите избавиться от хлопот связанных с созданием и поддержкой сайта, тогда вы попали по адресу. При работе с сайтами я предоставляю качественные услуги, ориентируясь на ваши индивидуальные потребности. Для связи со мной воспользуйтесь формой обратной связи.