
недавно столкнулся с проблемой, где товаров овер 80К и нужно было обновить для них main_category по алгоритму выборки родителя ($path = родитель_дитя_внук), для чего и с какой целью - упущу, сам факт логики следующий:
0. обнуляем по всей таблице значения на 0:
1. выбираем по нужному алгоритму (родитель\внук) ID категорию для обновления (ASC\DESC) :
p.s. $product['product_id'] - идентификатор товара, в контексте обновления приведу пример кода ниже.
2. собственно само обновление:
___
в итоге данной логики, мой код на обновление родителя выглядит вот так:
0. обнуляем по всей таблице значения на 0:
PHP:
$this->db->query("UPDATE `" . DB_PREFIX . "product_to_category` SET `main_category` = 0");
PHP:
$this->db->query("SELECT `category_id` FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product['product_id'] . "' ORDER BY `category_id` ASC LIMIT 1");
2. собственно само обновление:
PHP:
$this->db->query("UPDATE " . DB_PREFIX . "product_to_category SET main_category = '1' WHERE category_id = '" . (int)$query->row['category_id'] . "' AND product_id = '" . (int)$product['product_id'] . "'");
в итоге данной логики, мой код на обновление родителя выглядит вот так:
PHP:
// выборка всех товаров, у которых статус "включено"
$product_data = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE status = 1");
if ($product_data->num_rows) {
// обнуление всех главных категорий
$this->db->query("UPDATE `" . DB_PREFIX . "product_to_category` SET `main_category` = 0");
foreach ($product_data->rows as $product) {
// выборка родительских категорий по товару
$query = $this->db->query("SELECT `category_id`, `main_category` FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product['product_id'] . "' ORDER BY `category_id` ASC LIMIT 1");
// для выборки внуков (последних категорий в иерархии) нужно заменить "...ORDER BY `category_id` ASC LIMIT 1");" на "...ORDER BY `category_id` DESC LIMIT 1");"
if ($query->num_rows) {
// если ранее не задано положение main_category = '1', тогда проставляем его
if (!$query->row['main_category']) {
$this->db->query("UPDATE " . DB_PREFIX . "product_to_category SET main_category = '1' WHERE category_id = '" . (int)$query->row['category_id'] . "' AND product_id = '" . (int)$product['product_id'] . "'");
}
}
}
}