Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[Решено] SQL запрос для получения товаров из категории


Recommended Posts

Здравствуйте. Необходимо вытащить все товары из определенной категории для модуля. 

 

Вот код из модуля. Вытягивает товары с акциями.

if( isset($setting['tabs']['special']) ){
$products = $this->getProducts( $this->model_catalog_product->getProductSpecials( $data ), $setting );
$this->data['heading_title'] = $this->language->get('text_special');
}

Код функции для получения товаров с акциями

public function getProductSpecials($data = array()) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) 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) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$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())) GROUP BY ps.product_id";
 
$sort_data = array(
'pd.name',
'p.model',
'ps.price',
'rating',
'p.sort_order'
);
 
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
} else {
$sql .= " ORDER BY " . $data['sort'];
}
} else {
$sql .= " ORDER BY p.sort_order";
}
 
if (isset($data['order']) && ($data['order'] == 'DESC')) {
$sql .= " DESC, LCASE(pd.name) DESC";
} else {
$sql .= " ASC, LCASE(pd.name) ASC";
}
 
if (isset($data['start']) || isset($data['limit'])) {
if ($data['start'] < 0) {
$data['start'] = 0;
}
 
if ($data['limit'] < 1) {
$data['limit'] = 20;
}
 
$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
}
 
$product_data = array();
 
$query = $this->db->query($sql);
 
foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
 
return $product_data;
}

 
Необходимо преобразовать код для получения товаров с акциями в код для получения товаров из определенной категории. Код модуля понимаю, но не функции, которая вытягивает товары. Кто поможет, как надо преобразить? Просто заточить под вытягивание из категории с определенным id
Надіслати
Поділитися на інших сайтах


model_product_product

$this->data['products'] = array();

$data = array(
	'filter_category_id' => $category_id,
	'filter_filter'      => $filter, 
	'sort'               => $sort,
	'order'              => $order,
	'start'              => ($page - 1) * $limit,
	'limit'              => $limit
);
		
$results = $this->model_catalog_product->getProducts($data);
//Вызов метода getFoundProducts должен проводится сразу же после getProducts
//только тогда он выдает правильное значения количества товаров
$product_total = $this->model_catalog_product->getFoundProducts(); 

Выдерните код из категорий


 

UPD: Прошу прощения, не то написал.

 

Вот рабочий SQL код, там добавлен "left join oc_product_to_category p2c ON (p2c.product_id = ps.product_id)" WHERE "p2c.category_id = $data['category_id'] AND".

SELECT DISTINCT ps.product_id, (

SELECT AVG( rating ) 
FROM oc_review r1
WHERE r1.product_id = ps.product_id
AND r1.status =  '1'
GROUP BY r1.product_id
) AS rating
FROM oc_product_special ps
LEFT JOIN oc_product p ON ( ps.product_id = p.product_id ) 
LEFT JOIN oc_product_description pd ON ( p.product_id = pd.product_id ) 
LEFT JOIN oc_product_to_store p2s ON ( p.product_id = p2s.product_id ) 
LEFT JOIN oc_product_to_category p2c ON ( p2c.product_id = ps.product_id ) 
WHERE p2c.category_id =20
AND p.status =  '1'
AND p.date_available <= NOW( ) 
AND p2s.store_id =  '0'
AND ps.customer_group_id =  '1'
AND (
(
ps.date_start =  '0000-00-00'
OR ps.date_start < NOW( )
)
AND (
ps.date_end =  '0000-00-00'
OR ps.date_end > NOW( )
)
)
GROUP BY ps.product_id
ORDER BY LCASE( pd.name ) ASC , LCASE( pd.name ) ASC 
LIMIT 0 , 5

 

Вот готовый PHP:

$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) 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."product_to_category p2c ON (p2c.product_id = ps.product_id) WHERE p2c.category_id = '" . (int)$data['category_id'] . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$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())) GROUP BY ps.product_id";
 

 

Когда вставите, то передавайте в функцию getProductSpecials() массив $data, в котором $data['category_id'] = $category_id

Змінено користувачем halfhope
Надіслати
Поділитися на інших сайтах

model_product_product

$this->data['products'] = array();

$data = array(
	'filter_category_id' => $category_id,
	'filter_filter'      => $filter, 
	'sort'               => $sort,
	'order'              => $order,
	'start'              => ($page - 1) * $limit,
	'limit'              => $limit
);
		
$results = $this->model_catalog_product->getProducts($data);
//Вызов метода getFoundProducts должен проводится сразу же после getProducts
//только тогда он выдает правильное значения количества товаров
$product_total = $this->model_catalog_product->getFoundProducts(); 

Выдерните код из категорий

 

UPD: Прошу прощения, не то написал.

 

Вот рабочий SQL код, там добавлен "left join oc_product_to_category p2c ON (p2c.product_id = ps.product_id)" WHERE "p2c.category_id = $data['category_id'] AND".

SELECT DISTINCT ps.product_id, (

SELECT AVG( rating ) 
FROM oc_review r1
WHERE r1.product_id = ps.product_id
AND r1.status =  '1'
GROUP BY r1.product_id
) AS rating
FROM oc_product_special ps
LEFT JOIN oc_product p ON ( ps.product_id = p.product_id ) 
LEFT JOIN oc_product_description pd ON ( p.product_id = pd.product_id ) 
LEFT JOIN oc_product_to_store p2s ON ( p.product_id = p2s.product_id ) 
LEFT JOIN oc_product_to_category p2c ON ( p2c.product_id = ps.product_id ) 
WHERE p2c.category_id =20
AND p.status =  '1'
AND p.date_available <= NOW( ) 
AND p2s.store_id =  '0'
AND ps.customer_group_id =  '1'
AND (
(
ps.date_start =  '0000-00-00'
OR ps.date_start < NOW( )
)
AND (
ps.date_end =  '0000-00-00'
OR ps.date_end > NOW( )
)
)
GROUP BY ps.product_id
ORDER BY LCASE( pd.name ) ASC , LCASE( pd.name ) ASC 
LIMIT 0 , 5

 

Вот готовый PHP:

$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) 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."product_to_category p2c ON (p2c.product_id = ps.product_id) WHERE p2c.category_id = '" . (int)$data['category_id'] . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$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())) GROUP BY ps.product_id";
 

 

Когда вставите, то передавайте в функцию getProductSpecials() массив $data, в котором $data['category_id'] = $category_id

Разобрался сам, но все же спасибо большое!

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.