Выборка с одновременным выполнением двух условий ИЛИ

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 2.9.6

Задача

Предположим у товаров по группам заданы некие поля и необходимо выбрать те товары, у которых в одной группе полей либо одно поле равно указанному значению, либо другое, при этом, одновременно должно выполняться условие, что в другой группе полей одно или второе поле равно заданному значению, т.е. получится условие вида (А или В) и (С или D). Одним запросом при помощи selector, используя два раза режим or-mode такую выборку сделать не получится, так как между двумя условиями "ИЛИ" система поставит еще одно.

Решение

Реализовать такую выборку в UMI.CMS можно сделав два запроса к базе и получить "пересечение" их результатов, т.е. id товаров, а затем отобрать в результирующем запросе товары с данными id:

	$pages = new selector('pages');  
	$pages->types('object-type')->id(121);   

	$pages->option('or-mode')->fields('kolichestvo_podklyuchenij','weight');

	$pages->where('weight')->equals('7');

	$pages->where('kolichestvo_podklyuchenij')->equals('7');


	foreach($pages as $page){ 
	
	$mass[]=$page->id;
		
	} 

 
	$pages1 = new selector('pages');  
	$pages1->types('object-type')->id(121);   

	$pages1->option('or-mode')->fields('testovoe_pole_1','testovoe_pole_2');

	$pages1->where('testovoe_pole_1')->equals('7');

	$pages1->where('testovoe_pole_2')->equals('7');


	 foreach($pages1 as $page1){
	 
		$mass2[]=$page1->id;
	} 


	$diff = array_intersect($mass,$mass2);

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

	foreach($final as $object){
	
	echo "<a href=\"{$object->link}\">{$object->name}</a>\n";
	} 
	echo "Pages found: {$final->length}";