Запрос через XPDO к тв параметрам с использование having
Запрос на XPDO для выборки ресурсов у которых совпадают значения тв параметров.
Функция having посчитает количество совпадений по групперуемому полю contentid
Функция 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;
Так возможно получить список уникальных ресурсов по разному количеству условий.
Поблагодарить автора
Отправить деньги