Получение значений нескольких TV у списка ресурсов
Добрый день.
Возникла необходимость в сниппете использовать такую задачу:
У родителя 6037 есть ресурсы. Пока их около тысячи, но будет на много больше. Надо сделать выборку из этих ресурсов, при условии, что TV marketplace_sell = 6386…
А в выборке должны быть значения TV (в моем случае) SKU и quantity.
В xPDO что то трудновато с наскока разобраться, для выполнения нужной задачи. Пробовал найти аналогичный код, что бы модифицировать его под себя, но что то туплю…
Помогите пожалуйста…
Аналогичная задача получается таким запросом:
Возникла необходимость в сниппете использовать такую задачу:
У родителя 6037 есть ресурсы. Пока их около тысячи, но будет на много больше. Надо сделать выборку из этих ресурсов, при условии, что TV marketplace_sell = 6386…
А в выборке должны быть значения TV (в моем случае) SKU и quantity.
В xPDO что то трудновато с наскока разобраться, для выполнения нужной задачи. Пробовал найти аналогичный код, что бы модифицировать его под себя, но что то туплю…
Помогите пожалуйста…
Аналогичная задача получается таким запросом:
$params = array(
'parents' => 6037,
'limit' => 0,
'depth' => 1,
'select' => 'id',
'hideContainers' => 0,
'processTVs' => 1,
'prepareTVs' => 1,
'includeContent' => 0,
'where' => '{"marketplace_sell" : 6386}',
'includeTVs' => 'SKU,quantity',
'return'=> 'json',
);
$res = $modx->runSnippet('pdoResources', $params);
Вот только результат тяжеловат. Выполняется долго и если ресурсов около 1000, то возвращается ошибка. Поэтому пытаюсь сделать на xPDO. Комментарии: 8
Вот подобный вариант modx.pro/help/11494/, предоставленный уважаемым Ильей Уткиным…
<?php
// Предустановки
$urov1 = 1; // id tv urov1
$urov1_val = 'Щиты (шкафы) контрольно-пусковые';
$urov2 = 2; // id tv urov2
$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'urov1', 'modResource.id = urov1.contentid AND urov1.tmplvarid = ' . $urov1);
$q->leftJoin('modTemplateVarResource', 'urov2', 'modResource.id = urov2.contentid AND urov2.tmplvarid = ' . $urov2);
$q->groupby('modResource.id');
$q->select(array(
'DISTINCT(`urov2`.`value`) AS `urov2`'
));
$q->where(array(
'urov1.value' => $urov1_val
));
$count = $modx->getCount('modResource', $q);
$resources = array();
if ($q->prepare() && $q->stmt->execute()) {
$resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
print "<p>Всего ресурсов найдено: ".$count."</p><p>--</p>";
if ($resources) {
print "<p>Из них уникальных значений: ".count($resources)."</p>";
foreach($resources as $resource) {
print "<p><b>".$resource['urov2'] ."</b></p>";
}
}
А как добавить на выходе еще один TV? То есть в идеале, на выходе, должен получиться массив, в котором сопоставлены TV urov2 и новый urov3
Я не особов вникал, но еще одно TV так должно выбираться:
$q->select(array(
'DISTINCT(`urov2`.`value`) AS `urov2`',
'DISTINCT(`urov3`.`value`) AS `urov3`'
));
Я так пробовал:
<?php
// Предустановки
$urov1 = 150; // id tv urov1
$urov1_val = '6386';
$urov2 = 171; // id tv urov2
$urov3 = 139; // id tv urov2
$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'urov1', 'modResource.id = urov1.contentid AND urov1.tmplvarid = ' . $urov1);
$q->leftJoin('modTemplateVarResource', 'urov2', 'modResource.id = urov2.contentid AND urov2.tmplvarid = ' . $urov2);
$q->leftJoin('modTemplateVarResource', 'urov3', 'modResource.id = urov3.contentid AND urov3.tmplvarid = ' . $urov3);
$q->groupby('modResource.id');
$q->select(array(
'DISTINCT(`urov2`.`value`) AS `urov2`',
'DISTINCT(`urov3`.`value`) AS `urov3`'
));
$q->where(array(
'urov1.value' => $urov1_val
));
$count = $modx->getCount('modResource', $q);
$resources = array();
if ($q->prepare() && $q->stmt->execute()) {
$resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
print_r($resources);
Результат пустой…Array
(
)
Этот скрипт какой-то запутанный. Насколько я понимаю он недееспособен.
Откуда берется urov1.contentid, если задается только urov1?
Откуда берется urov1.contentid, если задается только urov1?
А как надо?
Неужели никто из гуру не знает, как сделать запрос.?! Прошу помощи. Готов заплатить даже…
Попробуйте так, только id tv на свои поменяйте
$q = $modx->newQuery('modResource');
$q->leftJoin('modTemplateVarResource', 'marketplace_sell', 'modResource.id = marketplace_sell.contentid AND marketplace_sell.tmplvarid = 7');
$q->leftJoin('modTemplateVarResource', 'quantity', 'modResource.id = quantity.contentid AND quantity.tmplvarid = 45');
$q->leftJoin('modTemplateVarResource', 'SKU', 'modResource.id = SKU.contentid AND SKU.tmplvarid = 5');
$q->select(array(
'modResource.id as id',
'marketplace_sell.value as marketplace_sell',
'quantity.value as quantity',
'SKU.value as SKU'
));
$q->where(array(
'marketplace_sell.value' => 6386
));
$q->groupby('modResource.id');
$q->prepare();
$q->stmt->execute();
$resources = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($resources);
Спасибо тебе большое, О Великий Человек!!!
Работает… Теперь буду разбираться, как это работает, что бы можно было в разных ситуациях применять…
Работает… Теперь буду разбираться, как это работает, что бы можно было в разных ситуациях применять…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.