Como salvar apenas um valor de atributo específico em vez de salvar todo o produto no Magento2

10

Como vocês já sabem, tínhamos o método abaixo no magento para salvar um valor de atributo específico como este.

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

ou

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

Alguém pode me informar a alternativa acima no Magento2 .

Kingshuk Deb
fonte

Respostas:

8

É o mesmo que Magento 1

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

Isso funcionará para qualquer entidade.

Conforme resposta de @ Raphael, não funcionará para atributos de vendas.

Basicamente, ele chama a função Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Isso aceitará dois parâmetros

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

O primeiro a ser $objecté um objeto que precisa ser atualizado e o segundo parâmetro será $attributeCodeo código para o atributo a ser atualizado.

Jaimin Sutariya
fonte
Deve ser basicamente para qualquer entidade.
Kingshuk Deb
Sim, funcionará para qualquer entidade. Ele basicamente chamará Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()que aceitará um objeto de dados e um código de entidade.
Jaimin Sutariya
Voto positivo, mas não aceito como resposta no momento. Vou verificar e atualizar.
precisa saber é o seguinte
Por favor, vá para a linha 1608 no arquivo. (Magento 2.1.5) há uma outra funçãopublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya
1
Parece que o magento basicamente manteve intactas todas as funções importantes.
precisa saber é o seguinte
4

Apenas para esclarecer a resposta de Jaimin:

Isso funcionará para qualquer entidade.

Isso não é verdade. Funcionará apenas para entidades EAV que estendemMagento\Eav\Model\Entity\AbstractEntity

Se você estiver lidando com uma entidade não EAV na qual o modelo de recursos se estende Magento\Framework\Model\ResourceModel\Db\AbstractDb, precisará implementar o saveAttributemétodo em seu modelo de recursos.

No Magento 2, eles fizeram isso para a Magento\Sales\Model\ResourceModel\Attributeclasse:

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;
}
Raphael na Digital Pianism
fonte
3

No caso do produto, você pode usar o objeto de ação em massa. Por exemplo:

// 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);
Mago Psico
fonte