Arbeiten Sie mit benutzerdefiniertem Produktattribut, ohne das Produktobjekt selbst zu laden
-
16-10-2019 - |
Frage
Ich muss ein benutzerdefiniertes Produktattribut für fast alle Produkte in der Datenbank manipulieren. Im Moment habe ich das:
$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');
}
}
Aber die Produkte sind mehr als 2000 und deshalb möchte ich das Produktobjekt selbst nicht laden, sondern nur mit der Produktobjektinstanz aus der Sammlung arbeiten. Das Problem ist, dass dieser obj. Die Instanz enthält nur 1/9 der gesamten Daten des Produktobjekts selbst. Und die 'customizableonly'
Attribut ist nicht Teil dieser 1/9.
Wie kann ich auf das Attribut zugreifen, ohne unnötiges Objekt zu laden? Oder im Allgemeinen - wie kann dieser Code maximal optimiert werden, daher ist er bei mehr als 2000 Produkten nicht dramatisch langsam?
Lösung
Holen Sie sich Ihre Sammlung so.
$productsCollection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('customizableonly');
Und hier ist eine andere Möglichkeit, alle Produkte gleichzeitig zu aktualisieren, damit Sie nicht anrufen müssen saveAttribute
2k mal.
Soweit ich verstehe, möchten Sie den Wert für festlegen customizableonly
bis 0 für alle Produkte, die diesen Wert nicht haben.
Hier geht:
$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);
Dies sollte Ihnen einen Geschwindigkeitsschub bringen.