Изменения оптовых цен Magento - PullRequest
5 голосов
/ 28 февраля 2011

Что я пытаюсь сделать, так это массовое изменение цен на товары определенной категории.Мы получаем рекомендованные розничные цены от нашего поставщика, но иногда они не работают для нас.Таким образом, нам нужно взять себестоимость продукта и, например, добавить 20% к продукту, так что… достаточно простая стоимость = стоимость + 0,2 * стоимость.Теперь мне нужно сделать это на всех продуктах в выбранной категории, так что вот что я имею до сих пор ...

$category = Mage::getModel('catalog/category')->load(189); 

// load products from category id '189'
$products   = Mage::getModel('catalog/product')
                ->getCollection()  
                ->addCategoryFilter($category)  
                ->addAttributeToSelect('id'); 

foreach($products as $product) { 
    // get the current cost of the product
    $cost = $db->fetchRow("SELECT value FROM `m_catalog_product_entity_decimal` WHERE entity_id='" . $product->getId() . "' AND attribute_id='68'");
    $cost = $cost['value']; 
    $newCost = $cost + $cost*$percentage; 

    // update the product with a new cost
    $db->query("UPDATE `m_catalog_product_entity_decimal` SET value='$newCost' WHERE entity_id='" . $product->getId() . "' AND attribute_id='64'"); 
}

Теперь мне нужно использовать сырой SQL, потому что мой php-сервер не можетсправиться с загрузкой и сохранением всех продуктов magento (в модели продукта утечка памяти в Magento 1.4).Вот почему я просто выбираю «id» из продукта, чтобы получить наименьшее количество данных.Я также понимаю, что выполнение всех этих SQL-запросов является пустой тратой ресурсов, и именно поэтому я здесь.Если бы в каждой из моих категорий было только 10 товаров, я бы использовал модель товара, чтобы обновить стоимость и сохранить товары, но иногда у меня бывает до 500 или более товаров в каждой категории за один раз.

Я надеюсь сжать это до одного запроса SQL и избавиться от цикла foreach и коллекции продуктов.Идентификатор атрибута стоимости равен 68, а идентификатор атрибута цены равен 64. Любая помощь по этому вопросу будет высоко ценится.

EDIT
Magento использует модель EAV для своей базы данных.Таким образом, для атрибутов, к которым мне нужно получить доступ, а именно «стоимость» и «цена», они оба расположены в m_catalog_product_entity_decimal

Таким образом, атрибут цены товара будет выглядеть в таблице

value_id    entity_type_id  attribute_id    store_id    entity_id   value
6401             4              64             0            2184      399.9500

value_id - это просто уникальное значение строк, entity_type_id 4 означает, что это атрибут продукта.Атрибут attribute_id связан с фактическим атрибутом.В этом случае 64 является attribute_id для «цены».Store_id не имеет значения.Entity_id - это фактический идентификатор продукта, а значение - это фактическая цена товара.

Ответы [ 4 ]

10 голосов
/ 01 марта 2011

Честно говоря, B00MER имеет правильную идею, но мне также приходилось делать подобные вещи в крайнем случае раньше.Кроме того, мне хотелось написать немного SQL.Если вы просто хотите умножить затраты на 1,2 для всех продуктов в категории, вы можете сделать что-то вроде этого:

update catalog_product_entity_decimal
  set value = value*1.2
  where attribute_id = 75 and
        entity_id IN (select product_id from catalog_category_product
                    where category_id = X);

Вам, несомненно, нужно будет переиндексировать все и проверить свои результаты, чтобы убедиться.Очевидно, замените X вашей целевой категорией, и похоже, что вы используете префикс таблицы m_, поэтому добавьте его тоже (я оставлю это для других искателей, которые приходят сюда).помогает!

Спасибо, Джо

2 голосов
/ 28 февраля 2011

Отказ от ORM в Magento (насколько это возможно, требует ресурсов) - не очень хорошая идея. Вот патч для утечки памяти 1.4 CE , и я бы сделал это «Magento» и избавил бы от головной боли, связанной с отсутствием или необходимостью частичных данных. Вы также можете рассмотреть Data Unidry RapidFlow , дорогой ценник, но стоит каждого пенни, если вам приходится часто управлять большим количеством данных о товарах / категориях.

1 голос
/ 01 марта 2011

Рассмотрим magmi , он может делать такие вещи и многое другое и использует прямой SQL.это также работает для установок нескольких магазинов.

0 голосов
/ 02 марта 2011

однако вы можете использовать объект данных magento для обновления примера:

$product = Mage::getModel('catalog/product')->load($id);
$product->setData('price',$value);
$product->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...