Запрос через XPDO к тв параметрам с использование having

Запрос на XPDO для выборки ресурсов у которых совпадают значения тв параметров.

Функция having посчитает количество совпадений по групперуемому полю contentid

$where = array(
        'game_season' => 2018,
        'game_type' => 105
    );
        
    $tmplvarid = array();
    $values = array();
    
    // Получаем ID тв параметра для выборки из базы данных
    $q = $modx->newQuery('modTemplateVar');
    $q->select('id,name');
    $q->where(array(
        'name:IN' => array_keys($where )
    ));
    if ($q->prepare() && $q->stmt->execute()) {
        while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
            if (isset($where[$row['name']])) {
               $tmplvarid[] = $row['id'];
               $values[] = $where[$row['name']];
            }
        }
    }
   
    $resources = array();
    $q = $modx->newQuery('modTemplateVarResource');
    
    // Добавляем оба условия 
    $q->where(array(
        'tmplvarid:IN' => $tmplvarid,
        'AND:value:IN' => $values
    ));
    
    // Групируем значение по полю с id ресурса
    $q->groupby('contentid');
    
    // Подсчет сколько одинаковых contentid было найдено
    $q->select(array(
        'contentid',
        'COUNT(contentid) as count',
    ));
    
    // Считаем количесво фильтров. Если меньше одного фильтра то having делать смысла нету
    $countFilter = count($tmplvarid);
    if ($countFilter > 1) {
        $countFilter = $countFilter - 1;
        $q->having('count > ' . $countFilter);
    }
    
    if ($q->prepare() && $q->stmt->execute()) {
        while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
            $resources[] = $row['contentid'];
        }
    }


   // Здесь получаем список ресурсов где совпадают условия выборки:  
   // $where = array( 'game_season' => 2018, 'game_type' => 105);
    echo '<pre>'; 
    print_r( $resources); die;
Так возможно получить список уникальных ресурсов по разному количеству условий.
Андрей Степаненко
26 апреля 2019, 14:36
modx.pro
11
1 268
+10
Поблагодарить автора Отправить деньги

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0