Работайте с пользовательским атрибутом продукта без загрузки самого объекта продукта
-
16-10-2019 - |
Вопрос
Мне нужно манипулировать пользовательским атрибутом продукта практически для всех продуктов в базе данных. Прямо сейчас у меня есть это:
$productsCollection = Mage::getModel('catalog/product')->getCollection();
foreach ($productsCollection as $_product) {
$product = Mage::getModel('catalog/product')->load($_product->getEntityId());
if ($product->getCustomizableonly() === null) {
$product->setData('customizableonly', 0)->getResource()->saveAttribute($product, 'customizableonly');
}
}
Но продукты составляют более 2000, и поэтому я не хочу загружать сам объект продукта, а работать только с экземпляром объекта продукта из коллекции. Проблема в том, что это OBJ. Экземпляр содержит только 1/9 от всего данных самого объекта продукта. И 'customizableonly'
Атрибут не является частью этого 1/9 -го.
Как я могу получить доступ к атрибуту, не делая ненужную загрузку объекта. Или в целом - как этот код может быть оптимизирован до максимума, поэтому он не сильно замедлен в случае 2000+ продуктов?
Решение
Получите свою коллекцию как эта.
$productsCollection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('customizableonly');
И вот другой способ обновления всех продуктов одновременно, поэтому вам не нужно звонить saveAttribute
2k раз.
Из того, что я понимаю, вы хотите установить значение для customizableonly
до 0 для всех продуктов, которые не имеют такой ценности.
Вот оно:
$toUpdate = array();
foreach ($productsCollection as $_product) {
if (is_null($_product->getCustomizableonly())) {
//remember the id for update
$toUpdate[] = $_product->getId();
}
}
//update all products
Mage::getSingleton('catalog/product_action')->updateAttributes($toUpdate, array('customizableonly'=>0), 0);
Это должно дать вам повышение скорости.