Magento: ошибка базы при обновлении индекса цен

Нам пришлось столкнуться что на реально большой базе индексация цен… мягко скажем сбоит. А грубо — админ товар добавил, а на сайте его то и нет. Вызов регенерации индексов валит базу( что же делать?

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'e.1' in ...

Мы как умные программисты анализируем какие у нас реально используется цены — и составляем схему. И так как мы еще и ленивые, то делаем минимальные апдейты. Например нам повезло, и у нас только цены третьей группы не такие как все), а цены не меняются через админку прямо, только добавляются новые товары. Поэтому схема наша проста (главная функция restorePrices): проверяем кого из товаров в индексе не хватает и забираем его групповые цены для 3, после чего ручками вставляем в индексную таблицу (вставку можно сделать массовой, но на момент «сбоев» мы можем и кусочково вставлять до достижения цели. По хорошему — можно обернуть в одну транзакцию.

define('PRICE_ATTRIBUTE', 75);
class MagentoPrices
{
 
	public static function restorePrices()
	{
		$list = DB::query('SELECT p.entity_id, p.value FROM catalog_product_entity_decimal AS p
                        LEFT JOIN catalog_product_index_price AS ind ON ind.entity_id=p.entity_id
			WHERE p.attribute_id=' . PRICE_ATTRIBUTE . ' AND p.entity_type_id=4 AND store_id=0
			AND ind.entity_id IS NULL', 'list');
		if (!$list) return false;
		$pids = array_keys($list);
		$group_3 = self::getPricesByGroup(3, $pids);
		foreach($list AS $pid => $usual) {
			$group_price = isset($group_3[$pid]) ? $group_3[$pid] : $usual;
			self::insertIdx($pid, $usual, $group_price);
		}
	}
	public static function getPrices()
	{
		return DB::query('SELECT entity_id, value FROM catalog_product_entity_decimal 
				WHERE attribute_id=' . PRICE_ATTRIBUTE . ' AND entity_type_id=4 AND store_id=0', 'list');
	}
	public static function getPricesByGroup($gid, $pids = array())
	{
		$sql = 'SELECT entity_id, value FROM catalog_product_entity_group_price
			WHERE customer_group_id= ' . $gid . ' AND website_id=0';
		if ($pids) $sql .= ' AND entity_id IN (' . implode(',', $pids) . ')';
		return DB::query($sql, 'list');
	}
 
	public static function insertIdx($pid, $usual, $group_3)
	{
		DB::query('INSERT catalog_product_index_price (
			entity_id, customer_group_id, website_id, tax_class_id, price, final_price, min_price, max_price, group_price
			)
			VALUES
			(' . $pid . ', 0, 1, 2, ' . $usual . ',' . $usual . ',' . $usual . ',' . $usual . ',NULL),
			(' . $pid . ', 1, 1, 2, ' . $usual . ',' . $usual . ',' . $usual . ',' . $usual . ',NULL),
			(' . $pid . ', 2, 1, 2, ' . $usual . ',' . $usual . ',' . $usual . ',' . $usual . ',NULL),
			(' . $pid . ', 3, 1, 2, ' . $usual . ',' . $group_3 . ',' . $group_3 . ',' . $group_3 . ',' . $group_3 . ')
		');
		DB::query('INSERT catalog_product_index_price_idx (
			entity_id, customer_group_id, website_id, tax_class_id, price, final_price, min_price, max_price, group_price
			)
			VALUES
			(' . $pid . ', 0, 1, 2, ' . $usual . ',' . $usual . ',' . $usual . ',' . $usual . ',NULL),
			(' . $pid . ', 1, 1, 2, ' . $usual . ',' . $usual . ',' . $usual . ',' . $usual . ',NULL),
			(' . $pid . ', 2, 1, 2, ' . $usual . ',' . $usual . ',' . $usual . ',' . $usual . ',NULL),
			(' . $pid . ', 3, 1, 2, ' . $usual . ',' . $group_3 . ',' . $group_3 . ',' . $group_3 . ',' . $group_3 . ')
		');
	}
}

Оставить комментарий

XHTML: Вы можете использовать такие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">