Получение значений нескольких TV у списка ресурсов

Добрый день.
Возникла необходимость в сниппете использовать такую задачу:
У родителя 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.
Сергей Максимов
10 мая 2017, 15:51
modx.pro
2 602
0

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

Сергей Максимов
11 мая 2017, 08:05
0
Вот подобный вариант 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
    Олег
    11 мая 2017, 10:49
    0
    Я не особов вникал, но еще одно TV так должно выбираться:
    $q->select(array(
        'DISTINCT(`urov2`.`value`) AS `urov2`',
        'DISTINCT(`urov3`.`value`) AS `urov3`'
    ));
      Сергей Максимов
      11 мая 2017, 17:06
      0
      Я так пробовал:
      <?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
      (
      )
        Олег
        12 мая 2017, 09:15
        0
        Этот скрипт какой-то запутанный. Насколько я понимаю он недееспособен.
        Откуда берется urov1.contentid, если задается только urov1?
Сергей Максимов
17 мая 2017, 08:23
0
Неужели никто из гуру не знает, как сделать запрос.?! Прошу помощи. Готов заплатить даже…
    Андрей
    17 мая 2017, 09:42
    +1
    Попробуйте так, только 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);
      Сергей Максимов
      18 мая 2017, 08:26
      0
      Спасибо тебе большое, О Великий Человек!!!
      Работает… Теперь буду разбираться, как это работает, что бы можно было в разных ситуациях применять…
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    8