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