Php modx revo xpdo or

Конструкция (. AND. ) OR (. AND. ) в &where

В параметр &where pdoResources передается json-массив параметров для фильтрации. Как должен выглядеть массив следующего вида?

(условие1 LIKE '%%' или условие2 LIKE '%%' или условие3 LIKE '%%') И (условие4 LIKE '%%' или условие5 LIKE '%%' или условие6 LIKE '%%')

Михаил /users/mdomansky modx.pro https://modx.pro

Комментарии: 4

$query = $xpdo->newQuery('Box'); $query->where(array( array( 'width:=' => 15, // note that adding 'AND:' or 'OR:' in front of the attribute, an operator must be used ':=' 'OR:width:=' => 10 ), array( 'AND:height:>=' => 10, 'AND:height: 15 ) )); $boxes = $xpdo->getCollection('Box',$query);

Спасибо за ответ.
А разве это сработает, если будет 3-4-5 условий? Потому что ключ массива получается одинаковый, см. ниже. Об этом есть в этом комменте modx.pro/howto/6198-complex-selection-on-the-tv-settings-in-getresources/#comment-44003

array( 'width:=' => 15, // note that adding 'AND:' or 'OR:' in front of the attribute, an operator must be used ':=' 'OR:width:LIKE' => '%10%', 'OR:width:LIKE' => '%15%' )

Вы можете написать в условии чистый SQL, выделив его прямыми скобками [ ]

$query = $xpdo->newQuery('Box'); $query->where(['width' = 15 OR 'width' = 10] $boxes = $xpdo->getCollection('Box',$query);

Можно использовать любые условия или SQL операторы.
А вообще использовать XPDO запросы считается неправильным, они создают лишнюю нагрузку.
Лучше использовать методы pdoTools getCollection и getArray

Спасибо особенно за чистый sql =))
Насчет xpdo, так я и не пытаюсь его использовать, я ищу самое простое решение для моей задачи, а задача сделать выборку со сложным фильтром. Почему-то в документации и примерах по pdoResources примеры только простые. Хотя моя задача — стандартная для обычного фильтра по параметрам (несколько из производителей И несколько из цветов).

Здесь упомянуты:

Добрый день! Есть возможность подружить данный компонент с msOrderFields? У меня в заказе создано много дополнительных полей с помощью msOrderFields и.

Ребята из modx.com недавно поменяли свой репозиторий и с тех пор не радуют стабильностью его работы. Я рад, что смог вам помочь. Если хотите (это со.

Да конечно, в строке кода должны быть собственные префиксы, или плейсхолдер префикса. Артур написал стандартный пример только ради примера.

Источник

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

В случае, если надо конкретизировать условия выборки записей, используются предикаты — выражения которые в качестве результата возвращают TRUE, FALSE или UNKNOWN. В случае использования CMF MODX количество вариаций записи предикатов возрастает, из-за большого количества языков, которые понимает данная система.

Читайте также:  Javascript html text to json

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

SQL: WHERE width = 15

MODX: &where=`width = 15`

JSON в тегах MODX: &where = `< "width":15 >` (данный тип записи в тегах MODX может срабатывать но заносить ошибку в лог)

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

JSON в fenom: ‘where’ => »

fenom: ‘where’ => [ ‘width’ => 15]

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

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

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

fenom: ‘where’ => [ ‘width’ => 15, ‘OR:width:=’ => 25 ]

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

Трафаретные символы

При составлении предикатов (условий выборки) можно использовать трафаретные символы:

  • символ подчеркивания (_) — означает любой единичный символ в проверяемом значении;
  • символ процента (%) — означает последовательность любых символов в проверяемом значении. Количество символов в такой последовательности не ограничено (от 0 и более).

Трафаретные символы открывают большой простор для творчества при создании предикатов:

# Где class не заканчивается на o, но не на go WHERE class NOT LIKE '%go' AND class LIKE '%o' ;

С трафаретными символами может возникнуть проблема в случае если искомая строка будет содержать аналогичные символы, например, если надо отыскать все значения, содержащие символ «_», то шаблон ‘%_%’ приведет к тому, что будут возвращены все записи из таблицы. В этом случае поможет указание экранирующего символа в ESCAPE или экранирующий символ \.

# указываем что символ # является экранирующим '%#_%' ESCAPE '#' # назначить можно любой символ, в этом примере | LIKE '25|%' ESCAPE '|' # некоторые версии SQL в качестве экранирующего могут принимать обратный слеш (\), # по примеру популярных языков программирования '%\_%' '25\%'

Теги 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`]]` . ]]
$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: < prettyprint code-area">[[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», то вероятно неправильно составлены критерии выборки.

Источник

xPDOQuery.where

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

  • Jens Wittmann – Gestaltung & Entwicklung
  • Digital Penguin
  • Dannevang Digital
  • deJaya
  • Following Sea
  • eydolan
  • Anton Tarasov
  • Raffy
  • CrewMark
  • Lefthandmedia
  • Murray Wood
  • YJ

$400 per month—let's make that $500!

xPDOQuery::where¶

Add a WHERE condition to the query. In general, the way this works is you append an operator to an attribute after a colon.

array('attribute:operator' => 'value') 
Operator Symbol Example
Equals none $query->where(array('width' => 15));
Not Equals != $query->where(array('width:!=' => 15));
Greater Than > $query->where(array('width:>' => 15));
Less Than $query->where(array('width: 15));
Greater Than or Equal to >= $query->where(array('width:>=' => 15));
Less Than or Equal to $query->where(array('width: 15));
Like LIKE $query->where(array('width:LIKE' => '%15%'));
Not Like NOT LIKE $query->where(array('width:NOT LIKE' => '%15%'));
Exists in IN $query->where(array('width:IN' => array(15,16,17,20)));
Not Exists in NOT IN $query->where(array('width:NOT IN' => array(15,16,17,20)));
Is Null IS $query->where(array('width:IS' => null));

Syntax¶

xPDOQuery where ([mixed $conditions = ''], [string $conjunction = xPDOQuery::SQL_AND], [mixed $binding = null], [integer $condGroup = 0]) 

Examples¶

Get all Boxes with width of 15.

$query = $xpdo->newQuery('Box'); $query->where(array( 'width' => 15, )); $boxes = $xpdo->getCollection('Box',$query); 

Get all boxes with a width of 15 or 10.

$query = $xpdo->newQuery('Box'); $query->where(array('width' => 15)); $query->where(array('width' => 10),xPDOQuery::SQL_OR); // you can use orCondition here as well $boxes = $xpdo->getCollection('Box',$query); 

An alternative method to get boxes with a width of 15 or 10.

$query = $xpdo->newQuery('Box'); $query->where(array( array( // two arrays used to contain the OR statement within the listed conditions 'width' => 15 ), array( 'width' => 10 ) ),xPDOQuery::SQL_OR); // use one array if no additional where statements are used. $boxes = $xpdo->getCollection('Box',$query); 

Next alternative method to get boxes with a width of 15 or 10.

$query = $xpdo->newQuery('Box'); $query->where(array( array( 'width' => 15 ), array( 'OR:width:=' => 10 ) )); $boxes = $xpdo->getCollection('Box',$query); 

Grab all boxes with a width greater than or equal to 15, but not with a width of 23.

$query = $xpdo->newQuery('Box'); $query->where(array( 'width:>=' => 15, 'width:!=' => 23, )); $boxes = $xpdo->getCollection('Box',$query); 

Get all boxes with a name with the letter 'q' in it:

$query = $xpdo->newQuery('Box'); $query->where(array( 'name:LIKE' => '%q%', )); $boxes = $xpdo->getCollection('Box',$query); 

Using and & or in the same query to get all boxes with a width of 15 or 10 and a height between 10 and 15.

$query = $xpdo->newQuery('Box'); $query->where(array( array( 'width:=' => 15, // note that adding 'AND:' or 'OR:' in front of the attribute, an operator must be used ':=' 'OR:width:=' => 10 ), array( 'AND:height:>=' => 10, 'AND:height: 15 ) )); $boxes = $xpdo->getCollection('Box',$query); 

More Complex Examples¶

If you have a more complex model with many joined tables, the where method should refer only to the class alias (not the class name) that contains the attribute. Below is an example of a query passed to the getCollectionGraph method, where you can see that myTable object is joined through to the user profile information.

$query = $modx->newQuery('myTable'); $query->where(array('Profile.fullname:LIKE' => '%Company%')); $records = $this->ParentCMS->getCollectionGraph('myTable', ' > >',$query); 

Another method is to pass a $criteria array immediately as the 2nd argument to newQuery. Notice how the alias "Resource" is used since that's what is listed as the alias in the schema definition for the modTemplateVarResource object:

$criteria = array(); $criteria['modTemplateVarResource.tmplvarid'] = 9; $criteria['modTemplateVarResource.value:IN'] = array('Red','Green','Blue'); $criteria['Resource.template'] = 2; $criteria = $modx->newQuery('modTemplateVarResource', $criteria); $tvrs = $modx->getCollectionGraph('modTemplateVarResource','>', $criteria); 

Here are a couple of different examples of doing subqueries:

See Also¶

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

  • Jens Wittmann – Gestaltung & Entwicklung
  • Digital Penguin
  • Dannevang Digital
  • deJaya
  • Following Sea
  • eydolan
  • Anton Tarasov
  • Raffy
  • CrewMark
  • Lefthandmedia
  • Murray Wood
  • YJ

$400 per month—let's make that $500!

Источник

Оцените статью