Как сохранить только определенное значение атрибута вместо сохранения всего продукта в Magento2

10

Как вы, ребята, уже знаете, мы использовали этот метод ниже в magento для сохранения определенного значения атрибута, как это.

// saving product attribute
$product = Mage::getModel('catalog/product')->load('id here');
$product->setName('your name here');
$product->getResource()->saveAttribute($product, 'name');

или

// saving customer attribute
$customer->setData($attrCode, $value)->getResource()->saveAttribute($customer, $attrCode);

Может кто-нибудь дать мне знать альтернативу вышеперечисленному в Magento2 .

Кингшук Деб
источник

Ответы:

8

Это так же, как Magento 1

$dataobject->setData('attribute_code', $value);
$dataobject->getResource()->saveAttribute($dataobject, 'attribute_code');

Это будет работать для любого лица.

Согласно ответу @ Raphael's Это не будет работать для атрибутов продаж.

В основном он вызывает функцию Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Это примет два параметра

saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)

Сначала должен быть $objectобъект, который должен быть обновлен, а вторым параметром будет $attributeCodeкод для атрибута, который будет обновлен.

Джаймин Сутария
источник
Это должно быть в основном для любого лица.
Кингшук Деб
Да, это будет работать для любого лица. Это будет в основном вызов, Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()который примет объект данных и код объекта.
Джаймин Сутария
Подтверждаю это, но не принимаю как ответ прямо сейчас. Я проверю и обновлю.
Кингшук Деб
Пожалуйста, перейдите к строке 1608 в файле. (Magento 2.1.5) есть еще одна функцияpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya
1
Кажется, magento в основном сохранил все важные функции без изменений.
Кингшук Деб
4

Просто чтобы уточнить ответ Джаймина:

Это будет работать для любого лица.

Это неправда. Это будет работать только для объектов EAV, которые расширяютMagento\Eav\Model\Entity\AbstractEntity

Если вы имеете дело с сущностью, не относящейся к EAV, в которой расширяется модель ресурсов, Magento\Framework\Model\ResourceModel\Db\AbstractDbвам придется реализовать saveAttributeметод в своей модели ресурсов.

В Magento 2 они сделали это для Magento\Sales\Model\ResourceModel\Attributeкласса:

public function saveAttribute(AbstractModel $object, $attribute)
{
    if ($attribute instanceof AbstractAttribute) {
        $attributes = $attribute->getAttributeCode();
    } elseif (is_string($attribute)) {
        $attributes = [$attribute];
    } else {
        $attributes = $attribute;
    }
    if (is_array($attributes) && !empty($attributes)) {
        $this->getConnection()->beginTransaction();
        $data = array_intersect_key($object->getData(), array_flip($attributes));
        try {
            $this->_beforeSaveAttribute($object, $attributes);
            if ($object->getId() && !empty($data)) {
                $this->getConnection()->update(
                    $object->getResource()->getMainTable(),
                    $data,
                    [$object->getResource()->getIdFieldName() . '= ?' => (int)$object->getId()]
                );
                $object->addData($data);
            }
            $this->_afterSaveAttribute($object, $attributes);
            $this->getConnection()->commit();
        } catch (\Exception $e) {
            $this->getConnection()->rollBack();
            throw $e;
        }
    }
    return $this;
}
Рафаэль в цифровом пианизме
источник
3

В случае продукта вы можете использовать объект массового действия. Например:

// Edit
$productIds = [123];
$attributesData = ['name' => 'new product name'];
$storeId = 0;
$productMassAction = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Catalog\Model\Product\Action');
$productMassAction->updateAttributes($productIds, $attributesData, $storeId);
MagePsycho
источник