Вызов загрузки с именем атрибута - $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' несколько неуместна (если она не является идентификатором сущности другого продукта), и все атрибуты будут быть загруженным для идентификатора сущности, содержащегося в модели.

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

Author: Peter O'Callaghan, 2013-11-08

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 (спасибо, Фабиан)

 9
Author: David Manners, 2017-10-14 22:18:26

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

Если вы действительно хотите загрузить продукт с помощью атрибута, который не является 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);
 0
Author: sv3n, 2017-10-14 22:55:53