keyboard_arrow_up

Einzelne EAV-Attribute performant speichern

Um ein Objekt in Magento zu speichern, bringen alle Models die Methode save() mit. Durch diese Methode weiß das Objekt automatisch, wie es sich selbst in der Datenbank abzulegen hat, egal, ob es sich um eine flache Tabelle oder ein EAV-Objekt mit mehreren Tabellen für die einzelnen Attribute handelt.

Ein Aufruf, um ein Objekt aufzurufen, ein Attribut zu bearbeiten und wieder in die Datenbank zu speichern, könnte wie folgt aussehen

// Produkt irgendwoher holen
$product = Mage::getModel("catalog/product")->load(142);
// Attribut ändern
$product->setTitle("Test");
// Produkt speichern
$product->save();

Dies funktioniert sehr gut, bei den EAV-Objekten ist der Speicher-Vorgang jedoch ein komplexer Vorgang, der recht viele Ressourcen vereinnahmt. Während des Speichervorgangs werden alle Attribute des Produktes in die Datenbank geschrieben, obwohl wir eigentlich nur den Titel verändert haben und diesen explizit ändern wollten.

Deshalb existiert in der abstrakten Klasse Mage_Eav_Model_Abstract, von dem alle EAV-Models abgeleitet werden, eine Methode saveAttribute(), mit dessen Hilfe ein einzelnes Attribut bequem und ressourcensparend gespeichert werden kann. Der oben gezeigte Code würde sich dann wie folgt ändern:

// Produkt irgendwoher holen
$product = Mage::getModel("catalog/product")->load(142);
// Attribut ändern
$product->setTitle("Test");
// Produkt anweisen, das geänderte Attribut zu speichern
$product->getResource()->saveAttribute($product, "title");

8 Kommentare

  1. Ich wüsste auch gerne, ob man mit dieser Methode die Kategorienzuordnung ändern kann, da man ansonsten für die Änderung der Zuordnung extra die save()-Methode aufrufen müsste und das ganze sehr inperformant wird.

    1. Meines Wissens klappt das ganze nur für EAV-Attribute. Aber Kategoriezuordnungen ändern sich ja (hoffentlich) nicht so oft wie einzelne Attributwerte.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht.