Как получить значение всех TV-полей ресурса одним SQL-запросом?
Задача решается в лоб, если значения TV-полей хранятся именно в виде нужных значений.
Если TV представляет собой список значений значение1==1||значение2==2||значение3==3, то в TV будет хранится цифры 1,2,3 а нам нужны значения значение1, значение2, значение3. Тогда задачу можно решить так
select t2.name, t2.caption, t2.description, t1.value
from modx_site_tmplvar_contentvalues as t1
left join modx_site_tmplvars as t2 on t1.tmplvarid = t2.id
where t1.contentid = :resourceId
Если TV представляет собой список значений значение1==1||значение2==2||значение3==3, то в TV будет хранится цифры 1,2,3 а нам нужны значения значение1, значение2, значение3. Тогда задачу можно решить так
select
t2.name, t2.caption, t2.description, if(t2.elements like concat('%==', t1.value, '%'), REGEXP_SUBSTR(t2.elements, concat('[:lower:]+(?=\={2}', t1.value, ')')), t1.value) as value
from modx_site_tmplvar_contentvalues as t1
left join modx_site_tmplvars as t2 on t1.tmplvarid = t2.id
where
t1.contentid = :resourceId
Но работать это будет только в MySql8, т.к. начиная с 8 версии появилась функция REGEXP_SUBSTR. Комментарии: 2
<?php
$id = 18; //ID ресурса
//Вариант 1
$coll = $modx->getCollection('modTemplateVarResource', array( 'contentid' => $id ));
if(!is_array($coll)) { return; }
foreach($coll as $tv){
print_r($tv->toArray());
}
//Вариант 2
$query = $modx->newQuery('modTemplateVarResource');
$query->select(array('modTemplateVarResource.*'));
$query->where(array(
'`modTemplateVarResource`.`contentid`' => $id
));
$query->sortby("id", "ASC");
$query->prepare();
print_r($query->toSQL());
$query->stmt->execute();
$rows = $query->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
print_r($row);
}
Оба варианта не будут работать если значения в TV хранятся как 1==Да||2==Нет.
1 вариант тормозной, берем 100 тысяч ресурсов, по 50 TV у каждого.
1 вариант тормозной, берем 100 тысяч ресурсов, по 50 TV у каждого.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.