Вывод наименьшей цены из списка товаров в категори

Здравствуйте.

Уже вхожу в тотальный затуп, но так и не получается реализовать в minishop2 вышеозвученную задачу.



Реализую запрос следующим образом:

//получаем список "детей" категории
if (empty($parent)) {$parent = $modx->resource->id;}
$pids = array_merge(array($parent), $modx->getChildIds($parent));
$ids = array();

//выбираем из него только опубликованные товары
$q = $modx->newQuery('msProduct');
$q->where(array('class_key' => 'msProduct','parent:IN' => $pids,'published' => 1,'deleted' => 0));
$q->select('`msProduct`.`id`');
if ($q->prepare() && $q->stmt->execute()) {
	$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
}

//подцепляем к нему товары из мультикатегорий
$q = $modx->newQuery('msProduct');
$q->leftJoin('msCategoryMember', 'Member', '`Member`.`product_id` = `msProduct`.`id`');
$q->where(array('class_key' => 'msProduct','Member.category_id:IN' => $pids,'published' => 1,'deleted' => 0));
$q->select('`msProduct`.`id`');
if ($q->prepare() && $q->stmt->execute()) {
	$ids2 = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
	if (!empty($ids2)) {
		$ids = array_unique(array_merge($ids, $ids2));
	}
}

//счетчик товаров
$count = count($ids);
$modx->setPlaceholder('catalog.count',$count);

if ($count == 0) {
	$modx->setPlaceholder('catalog.min',$count);
}
else {
	//получаем наименьшую цену из товаров категории
	$q = $modx->newQuery('msProduct');
	$q->where(array('id:IN' => $ids));
	$q->sortby('price', 'DESC');
	$q->select(array(
		"msProduct.id",
		"msProduct.price",
	));
	$q->limit(1);
	if ($q->prepare() && $q->stmt->execute()) {
		$min = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
		if (!empty($min['price'])) {
			$modx->setPlaceholder('catalog.min',$min['price']);
		}
	}
}

return;
— ошибок в консоли нет, но цена упорно не выбирается. В чем может быть причина? Заранее спасибо.
Максим Кузнецов
24 января 2015, 23:16
modx.pro
7
3 901
0

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

Максим Кузнецов
26 января 2015, 20:47
0
Слегка обновил последнюю часть до:
$q = $modx->newQuery('msProduct');
	$q->innerJoin('msProductData', 'msProductData', '`msProductData`.`product_id` = `msProduct`.`id`');
	$q->where(array('msProduct.id:IN' => $ids, 'msProductData.price:>=' => "0"));
	$q->sortby('msProductData.price', 'DESC');
	$q->select('`msProductData`.`price`');
	$q->limit(1);
	if ($q->prepare() && $q->stmt->execute()) {
		$min = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
		if (!empty($min['price'])) {
			$modx->setPlaceholder('catalog.min',$min['price']);
		}
	}
— но все равно нет никакого результата и в логах пустота…
    Василий Наумкин
    26 января 2015, 22:03
    6
    0
    $pdo = $modx->getService('pdoFetch');
    $result = $pdo->getArray(
    	// Класс
    	'msProduct',
    	// Условие where
    	array(
    		'deleted' => false,
    		'published' => true,
    	),
    	// Параметры выборки
    	array(
    		'parents' => 5, // Категория с товарами
    		'innerJoin' => array(
    			'Data' => array('class' => 'msProductData')
    		),
    		'select' => array('Data' => 'price'),
    		'sortby' => 'Data.price',
    		'sortdir' => 'asc',
    	)
    );
    if (!empty($result)) {
    	echo $result['price'];
    }
    // При желании можно лог посмотреть
    echo '<pre>';
    print_r($modx->getPlaceholder('pdoTools.log'));
      Максим Кузнецов
      26 января 2015, 22:34
      0
      Оу, большое спасибо! Даже не думал, что так легко можно их зассумонить.

      Вот что вышло (вывожу минимальную цену товара из категорий, включая мультикатегории, имея список id товаров):
      $pdo = $modx->getService('pdoFetch');
      	$result = $pdo->getArray(
      		'msProduct',
      		array(
      			'deleted' => false,
      			'published' => true,
      			'Data.price:>' => '0',
      			'id:IN' => $ids,
      		),
      		array(
      			'innerJoin' => array(
      				'Data' => array('class' => 'msProductData')
      			),
      			'select' => array('Data' => 'price'),
      			'sortby' => 'Data.price',
      			'sortdir' => 'asc',
      			'limit' => '1',
      		)
      	);
      	if (!empty($result)) {
      		if (substr($result['price'], -3, 3) == ".00") {
      			$min = substr($result['price'],0,-3);
      		}
      		$modx->setPlaceholder('catalog.min',$min);
      	}
      Павел
      14 декабря 2017, 12:57
      0
      Добрый день! Подскажите, пожалуйста, при такой конструкции запроса:

      $pdo = $modx->getService('pdoFetch');
      $result = $pdo->getArray(
      'msProduct',
      array(
      'id' => $id,),
      array(
      'innerJoin' => array(
      'Data' => array('class' => 'msProductData')),
      'select' => array('Data' => '*'),
      'limit' => '1',
      )
      );

      как заджойнить табличку modx_ms2_product_options, т.е. вместе со свойствами товара получить ещё и опции?
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5