Вызов загрузки с именем атрибута - $product->загрузить ("имя атрибута");
Просматривая один из проектов, над которыми я работал, я постоянно натыкаюсь на код, который выполняет $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
. Если это так, строка 'attribute_code'
несколько неуместна (если она не является идентификатором сущности другого продукта), и все атрибуты будут быть загруженным для идентификатора сущности, содержащегося в модели.
Правильно ли я понимаю, или я что-то упускаю?
2 answers
Короче говоря, да, то, что вы предлагаете, правильно. Оператор 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);