Frage

Wenn ich eines der Projekte, an denen ich gearbeitet habe $product->load('attribute_name'), wo das Produkt eine Instanz von ist Mage_Catalog_Model_Product. Durch den Code für ein Produktmodell werde ich nicht feststellen, was dies tun soll. Ist dies nur ein Missverständnis von dem, wer diesen benutzerdefinierten Code geschrieben hat, oder fehlt mir etwas?

Für mich würde dies versuchen, ein Produkt mit der ID von 'Attribute_Code' zu laden, was nicht existiert. In dieser Situation würde es treffen Mage_Eav_Model_Entity_Abstract::load mit $product, 'attribute_code', array() als Argumente. Dies würde das aktuelle Modell tatsächlich als neu markieren mit isObjectNew(true) Da es nicht aus der Datenbank geladen werden kann, aber seitdem $attributes ist leer, es wird auslösen Mage_Eav_Model_Entity_Abstract::loadAllAttributes, was aufgrund der Tatsache, dass das Modell teilweise geladen wurde und somit bereits eine Entity_ID enthält, alle Attribute aus der Datenbank dafür abgerufen entity_id. Wenn dies der Fall ist, ist die Zeichenfolge 'attribute_code' ist etwas irrelevant (solange es nicht die Entity_id eines anderen Produkts ist) und alle Attribute werden für das im Modell enthaltene Entity_ID geladen.

Ist mein Verständnis richtig oder fehlt mir etwas?

War es hilfreich?

Lösung

Kurz gesagt, ja, was Sie vorschlagen, ist korrekt. Die Auswählungsanweisung, die beim Aufrufen der Last in Ihrer Frage erstellt wurde, lautet wie folgt.

SELECT `catalog_product_entity`.* FROM `catalog_product_entity` WHERE (entity_id ='attribute_name')

Sie können dies herausfinden, indem Sie die Lastmethode in der Lastmethode eingeben Mage_Eav_Model_Entity_Abstract

Wenn Sie tatsächlich ein Produkt über ein Attribut laden möchten, das nicht ist entity_id Der folgende Ausschnitt würde es tun.

Mage::getModel('catalog/product')->loadByAttribute('sku', 'My Sku Value');

Hinweis: mit loadByAttribute Wenn das Attribut nicht eindeutig ist, wird das erste gefundene Objekt zurückgegeben

Zweiter Anmerkung: Dies gibt entweder eine zurück object oder false (Danke Fabian)

Andere Tipps

Zusätzlich zu David Manners ...

Wenn Sie tatsächlich ein Produkt über ein Attribut laden möchten, das nicht ist entity_id Der folgende Ausschnitt würde es tun.

Mage::getModel('catalog/product')->loadByAttribute('sku', 'My Sku Value');

Um das Laden zu beschleunigen, sollten Sie sich darum kümmern loadByAttribute 3. Parameter.

https://github.com/openmage/magento-lts/blob/1.3.x/app/code/core/mage/catalog/model/abstract.php#l216-l235

/**
 * Load entity by attribute
 *
 * @param Mage_Eav_Model_Entity_Attribute_Interface|integer|string|array $attribute
 * @param null|string|array $value
 * @param string $additionalAttributes
 * @return bool|Mage_Catalog_Model_Abstract
 */
public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
{
    $collection = $this->getResourceCollection()
        ->addAttributeToSelect($additionalAttributes)
        ->addAttributeToFilter($attribute, $value)
        ->setPage(1,1);

    foreach ($collection as $object) {
        return $object;
    }
    return false;
}

Satz $additionalAttributes zu null (nur Standardattribute) oder array('your', 'attributes', 'here') für Ihre eigene.

$attributesToSelect = array('name');
Mage::getModel('catalog/product')->loadByAttribute('sku', 'My Sku Value', $attributesToSelect);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top