кастомный getProducts для категории
catalog/model/catalog/product.php
метод getProducts имеет следующий цикл
foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
те на каждый товар категории у нас создается отгдельный запрос с кучей условий. как избавится от порожгдения кули новых запросов?
полулить все в одном запросе. без цикличного вызова метода getProduct
foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $result;
}
в родном запросе мы полулим: id, рейтинг, акцию и дискаунт
в моем случае для категории мне нужно: когдачество, изображение, название товара, id , этона
//исходный
$sql = "SELECT p.product_id, (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 price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_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 p.product_id
на
SELECT p.product_id, p.image, p.price, p.quantity, pd.name
$sql = "SELECT p.product_id, p.image, p.price, p.quantity, pd.name, (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 price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_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";
//тесты
10 срезов по ttfb показали
категория 50 товаров. 62.8 => 23.5 ms
категория 30 товаров: 45.8 => 22.7 ms
$startTime = microtime(true);
$query = $this->db->query($sql);
foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $result;
//$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
$msec = (microtime(true) - $startTime)*1000;
if($_SERVER['REMOTE_ADDR']=='ваш айпи')
{
echo round($msec,2);
exit();
}
-
1
10 комменириев
Рекомендованные комменирии
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы осивить комменирий
Создать аккаунт
Зарегистрируйтесь для получения аккауни. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите згдесь.
Войти сейчас