Как получить значение всех TV-полей ресурса одним SQL-запросом?

Задача решается в лоб, если значения TV-полей хранятся именно в виде нужных значений.

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.
Павел Голубев
23 октября 2020, 15:59
modx.pro
358
0

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

Тодор
26 октября 2020, 14:06
0
<?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);
}
    Павел Голубев
    26 октября 2020, 14:15
    0
    Оба варианта не будут работать если значения в TV хранятся как 1==Да||2==Нет.
    1 вариант тормозной, берем 100 тысяч ресурсов, по 50 TV у каждого.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2