Спсибо за ответ, версии 25.1 без году неделя. Сколько там неисследованных багов? Стоит ли обновляться с протестированного релиза, если даже неизвестно решена ли там проблема?
Залез в модель record и расстроился.
getProductRelated получает товары запросом к БД, а потом в цикле для каждого ID товара получает отдельно данные. Зачем?
Почему нельзя получить все данные одним запросом и вернуть set? Ну кто делает sql запросы в цикле? Может я что то недопонимаю, я все таки работаю больше не с mysql а с MSSQL, но я бы все таки сделал один запрос по условию, что ИД товара в результатах запроса к записи.
В первом запросе судя по всему нужен только product_id, зачем тут select *? Придется сделать ревизию всех моделей....
public function getProductRelated($record_id, $pointer = 'product_id')
{
$product_data = array();
$sql = "SELECT *
FROM " . DB_PREFIX . "record_related pr
LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id)
LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
WHERE pr.pointer_id = '" . (int) $record_id . "'
AND p.status = '1' AND p.date_available <= NOW() AND pr.pointer='".$pointer."'
AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "'";
$query = $this->db->query($sql);
foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
return $product_data;
}
public function getProduct($product_id)
{
$query = $this->db->query("
SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer,
(SELECT price FROM " . DB_PREFIX . "product_special ps
WHERE
ps.product_id = p.product_id
AND
ps.customer_group_id = '" . (int) $this->config->get('customer_group_id') . "'
AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW()))
ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special,
(SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int) $this->config->get('customer_group_id') . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int) $this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int) $this->config->get('config_language_id') . "') AS weight_class,
(SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int) $this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order
FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id)
LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) WHERE p.product_id = '" . (int) $product_id . "' AND pd.language_id = '" . (int) $this->config->get('config_language_id') . "'
AND p.status = '1'
AND p.date_available <= NOW()
AND p2s.store_id = '" . (int) $this->config->get('config_store_id') . "'");
if ($query->num_rows) {
$query->row['price'] = $query->row['price'];
$query->row['rating'] = round ($query->row['rating']);
return $query->row;
} else {
return false;
}
}