Вызововая загрузка с помощью имени атрибута - $ product-> load ('attribute_name');
-
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 -й параметр.
/**
* 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);