Вызововая загрузка с помощью имени атрибута - $ product-> load ('attribute_name');

magento.stackexchange https://magento.stackexchange.com/questions/10557

  •  16-10-2019
  •  | 
  •  

Вопрос

Просматривая один из проектов, над которыми я работал, я продолжаю находить код, который делает $product->load('attribute_name'), где продукт является примером Mage_Catalog_Model_Product. Анкет Копаясь через код для модели продукта, я не вижу, что это должно делать. Это просто недоразумение от того, кто написал этот пользовательский код, или я что -то упускаю?

Насколько я обеспокоен, это попыталось бы загрузить продукт с идентификатором «attribute_code», которого не существует. В этой ситуации это ударило Mage_Eav_Model_Entity_Abstract::load с $product, 'attribute_code', array() как аргументы. Это на самом деле назвало бы текущую модель новой с isObjectNew(true) Поскольку он не может быть загружен из базы данных, но с $attributes пусто, он запустит Mage_Eav_Model_Entity_Abstract::loadAllAttributes, что из -за того, что модель была частично загружена и, таким образом, уже содержит entity_id, извлекает все атрибуты из базы данных для этого entity_id. Анкет Если это так, строка 'attribute_code' несколько не имеет значения (до тех пор, пока он не является entity_id другого продукта), а все атрибуты будут загружены для entity_id, содержащейся в модели.

Мое понимание правильно, или я что -то упускаю?

Это было полезно?

Решение

Короче говоря, да, то, что вы предлагаете, правильно. Оператор SELECT, созданный при вызове нагрузки в ваш вопрос, будет следующим.

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

Вы можете узнать это, добавив некоторую отладку в метод загрузки в Mage_Eav_Model_Entity_Abstract

Если вы на самом деле хотите загрузить продукт через атрибут, который не entity_id Следующий фрагмент сделает это.

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

Примечание: с loadByAttribute Если атрибут не уникален, то первый найденный объект будет возвращен

Второе примечание: это вернет либо object или же false (Спасибо, Фабиан)

Другие советы

В дополнение к Дэвиду Мэннерс ...

Если вы на самом деле хотите загрузить продукт через атрибут, который не entity_id Следующий фрагмент сделает это.

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

Чтобы ускорить загрузку, вы должны позаботиться о loadByAttribute 3 -й параметр.

https://github.com/openmage/magento-lts/blob/1.9.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;
}

Установлен $additionalAttributes к null (просто атрибуты по умолчанию) или array('your', 'attributes', 'here') для вашего собственного.

$attributesToSelect = array('name');
Mage::getModel('catalog/product')->loadByAttribute('sku', 'My Sku Value', $attributesToSelect);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top