Выборка с использованием условия ИЛИ для системного поля
Материал из Umicms
Версия от 09:41, 2 июня 2014; Williwaw (обсуждение | вклад) (Новая страница: «'''Актуально для версии 2.9.6''' == Задача == Предположим необходимо отобрать страницы(наприме…»)
Актуально для версии 2.9.6
Задача
Предположим необходимо отобрать страницы(например товары) у которых либо id входит в множество определенных значений, либо у этой страницы любое другое поле равно определенному значению. Для выборки с условием "ИЛИ" используется or-mode, но дело в том, что для системных полей данный режим не сработает. Системные поля - это:
- 'id'
- 'name'
- 'owner'
- 'domain'
- 'lang'
- 'is_deleted'
- 'is_active'
- 'is_visible'
- 'updatetime'
- 'is_default'
- 'template_id'
Решение
Реализовать такую выборку в UMI.CMS можно сделав два запроса к базе и получить "пересечение" их результатов, т.е. id товаров, а затем отобрать в результирующем запросе товары с данными id:
$pages = new selector('pages');
$pages->types('object-type')->id('идентификатор нужного типа данных');
$pages->option('or-mode')->fields('поле_первой_группы1','поле_первой_группы2');
$pages->where('поле_первой_группы1')->equals('значение');
$pages->where('поле_первой_группы2')->equals('значение');
foreach($pages as $page){
$mass[]=$page->id;
}
$pages1 = new selector('pages');
$pages1->types('object-type')->id('идентификатор нужного типа данных');
$pages1->option('or-mode')->fields('поле_второй_группы1','поле_второй_группы2');
$pages1->where('поле_второй_группы1')->equals('значение');
$pages1->where('поле_второй_группы2')->equals('значение');
foreach($pages1 as $page1){
$mass2[]=$page1->id;
}
$diff = array_intersect($mass,$mass2);
$final = new selector('pages');
$final->types('object-type')->id('идентификатор нужного типа данных');
$final->where('id')->equals($diff);
foreach($final as $object){
echo "<a href=\"{$object->link}\">{$object->name}</a>\n";
}
echo "Pages found: {$final->length}";