Cómo guardar solo un valor de atributo específico en lugar de guardar todo el producto en Magento2

10

Como ustedes ya saben , solíamos tener este método a continuación en magento para guardar un 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');

o

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

¿Alguien puede hacerme saber la alternativa de lo anterior en Magento2 ?

Kingshuk Deb
fuente

Respuestas:

8

Es lo mismo que Magento 1

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

Esto funcionará para cualquier entidad.

Según la respuesta de @ Raphael, no funcionará para los atributos de ventas.

Básicamente llama a la función Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Esto aceptará dos parámetros

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

El primero en ser $objectes un objeto que debe actualizarse y el segundo parámetro será $attributeCodeel código para el atributo que se actualizará.

Jaimin Sutariya
fuente
Debería ser básicamente para cualquier entidad.
Kingshuk Deb
Sí, funcionará para cualquier entidad. Básicamente llamará a Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()lo que aceptará un objeto de datos y un código de entidad.
Jaimin Sutariya
Votarlo pero no aceptarlo como respuesta en este momento. Comprobaré y actualizaré.
Kingshuk Deb
Vaya a la línea 1608 en el archivo. (Magento 2.1.5) hay otra funciónpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya el
1
Parece que magento básicamente ha mantenido intactas todas las funciones importantes.
Kingshuk Deb
4

Solo para aclarar la respuesta de Jaimin:

Esto funcionará para cualquier entidad.

Esto no es verdad. Solo funcionará para entidades EAV que se extiendanMagento\Eav\Model\Entity\AbstractEntity

Si se trata de una entidad no EAV donde se extiende el modelo de recursos Magento\Framework\Model\ResourceModel\Db\AbstractDb, deberá implementar el saveAttributemétodo en su modelo de recursos.

En Magento 2, lo han hecho para la Magento\Sales\Model\ResourceModel\Attributeclase:

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 en Digital Pianism
fuente
3

En el caso del producto, puede usar el objeto de acción masiva. Por ejemplo:

// 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
fuente