Comment enregistrer uniquement la valeur d'attribut spécifique plutôt que d'enregistrer le produit entier dans Magento2

10

Comme vous le savez déjà, nous avions cette méthode ci-dessous dans magento pour enregistrer une valeur d'attribut spécifique comme celle-ci.

// 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);

Quelqu'un peut-il me faire connaître l' alternative de ce qui précède dans Magento2 .

Kingshuk Deb
la source

Réponses:

8

C'est la même chose que Magento 1

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

Cela fonctionnera pour n'importe quelle entité.

Selon la réponse de @ Raphael, cela ne fonctionnera pas pour les attributs de vente.

Fondamentalement, il appelle la fonction Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () .

Cela acceptera deux paramètres

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

Le premier à être $objectest un objet qui doit être mis à jour et le deuxième paramètre sera $attributeCodele code de l'attribut à mettre à jour.

Jaimin Sutariya
la source
Cela devrait être fondamentalement pour n'importe quelle entité.
Kingshuk Deb
Oui, cela fonctionnera pour n'importe quelle entité. Il appellera essentiellement Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()qui acceptera un objet de données et un code d'entité.
Jaimin Sutariya
Le voter mais ne pas l'accepter comme réponse pour le moment. Je vais vérifier et mettre à jour.
Kingshuk Deb
Veuillez passer à la ligne 1608 dans le fichier. (Magento 2.1.5) il y a une autre fonctionpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya
1
Il semble que magento ait fondamentalement conservé toutes les fonctions importantes.
Kingshuk Deb
4

Juste pour clarifier la réponse de Jaimin:

Cela fonctionnera pour n'importe quelle entité.

Ce n'est pas vrai. Cela ne fonctionnera que pour les entités EAV qui s'étendentMagento\Eav\Model\Entity\AbstractEntity

Si vous traitez avec une entité non EAV où le modèle de ressource s'étend, Magento\Framework\Model\ResourceModel\Db\AbstractDbvous devrez implémenter la saveAttributeméthode dans votre modèle de ressource.

Dans Magento 2, ils l'ont fait pour la 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 chez Digital Pianism
la source
3

Dans le cas d'un produit, vous pouvez utiliser l'objet d'action de masse. Par exemple:

// 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
la source