Выборка с использованием условия ИЛИ для системного поля — различия между версиями

Материал из Umicms
Перейти к:навигация, поиск
(Новая страница: «'''Актуально для версии 2.9.6''' == Задача == Предположим необходимо отобрать страницы(наприме…»)
 
 
(не показано 5 промежуточных версий 1 участника)
Строка 17: Строка 17:
  
 
== Решение ==
 
== Решение ==
Реализовать такую выборку в UMI.CMS  можно сделав два запроса к базе и получить "пересечение" их результатов, т.е. id товаров, а затем отобрать в результирующем запросе товары с данными id:
+
Реализовать такую выборку в UMI.CMS  можно, сделав два запроса к базе и получить объединение их результатов, т.е. id страниц, а затем отобрать в результирующем запросе страницы с данными id
 +
Предположим, будем искать страницы товаров, у которых либо идентификатор находится в определенном диапазоне, либо страница отмечена чекбоксом, который создал пользователь. На самом деле, режим or-mode в данном случае не понадобится. Выбираем страницы по системному полю id:
  
 
<source lang="php">
 
<source lang="php">
  
$pages = new selector('pages');
+
$pages = new selector('pages');
$pages->types('object-type')->id('идентификатор нужного типа данных'); 
+
$pages->types('object-type')->name('catalog', 'object');
 
+
$pages->where('id')->equals(array('идентификаторы страниц через запятую'));
$pages->option('or-mode')->fields('поле_первой_группы1','поле_первой_группы2');
+
//запишем id полученных страниц в массив
 
+
foreach($pages as $page){  
$pages->where('поле_первой_группы1')->equals('значение');
 
 
 
$pages->where('поле_первой_группы2')->equals('значение');
 
 
 
 
 
foreach($pages as $page){  
 
 
 
$mass[]=$page->id;
+
$mass[] = $page->id;
 
 
 
}  
 
}  
 +
</source>
  
+
Теперь выберем страницы отмеченные чекбоксом:
$pages1 = new selector('pages'); 
 
$pages1->types('object-type')->id('идентификатор нужного типа данных'); 
 
  
$pages1->option('or-mode')->fields('поле_второй_группы1','поле_второй_группы2');
+
<source lang="php">
  
$pages1->where('поле_второй_группы1')->equals('значение');
+
$pages1 = new selector('pages');
 +
$pages1->types('object-type')->name('catalog', 'object');
 +
$pages1->where('идентификатор поля')->equals(1);
 +
//запишем id полученных страниц в массив
 +
foreach($pages1 as $page1){
 +
 +
$mass2[] = $page1->id;
 +
}
 +
</source>
  
$pages1->where('поле_второй_группы2')->equals('значение');
+
Теперь необходимо объединить полученные множества идентификаторов, воспользуемся функцией array_merge(), получим новый массив идентификаторов, затем, уберем повторяющиеся значения и сделаем выборку объектов по id из результирующего массива:
  
  
foreach($pages1 as $page1){
+
<source lang="php">
 
$mass2[]=$page1->id;
 
}
 
  
 +
$diff = array_merge($mass,$mass2);
 +
$diff = array_unique($diff);
  
$diff = array_intersect($mass,$mass2);
+
$final = new selector('pages'); 
 +
$final->types('object-type')->name('catalog', 'object');
 +
$final->where('id')->equals($diff);
  
$final = new selector('pages'); 
+
</source>
$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}"; 
 
  
</source>
+
[[Категория:API]]

Текущая версия на 15:03, 21 ноября 2018

Актуально для версии 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 Предположим, будем искать страницы товаров, у которых либо идентификатор находится в определенном диапазоне, либо страница отмечена чекбоксом, который создал пользователь. На самом деле, режим or-mode в данном случае не понадобится. Выбираем страницы по системному полю id:

$pages = new selector('pages');
$pages->types('object-type')->name('catalog', 'object');
$pages->where('id')->equals(array('идентификаторы страниц через запятую'));
//запишем id полученных страниц в массив
foreach($pages as $page){ 
	
	$mass[] = $page->id;
		
	}

Теперь выберем страницы отмеченные чекбоксом:

$pages1 = new selector('pages');
$pages1->types('object-type')->name('catalog', 'object');
$pages1->where('идентификатор поля')->equals(1);
//запишем id полученных страниц в массив
foreach($pages1 as $page1){
	 
		$mass2[] = $page1->id;
	}

Теперь необходимо объединить полученные множества идентификаторов, воспользуемся функцией array_merge(), получим новый массив идентификаторов, затем, уберем повторяющиеся значения и сделаем выборку объектов по id из результирующего массива:


$diff = array_merge($mass,$mass2);
$diff = array_unique($diff);

$final = new selector('pages');  
$final->types('object-type')->name('catalog', 'object'); 
$final->where('id')->equals($diff);

Таким образом можно осуществлять выборки с выполнением условия "ИЛИ" для любого системного и "обычного" поля.