So speichern Sie nur einen bestimmten Attributwert, anstatt das gesamte Produkt in Magento2 zu speichern


10

Wie ihr bereits wisst, hatten wir diese Methode in Magento, um einen bestimmten Attributwert wie diesen zu speichern .

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

oder

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

Kann mir jemand die Alternative der oben genannten in Magento2 mitteilen .

Antworten:


8

Es ist das gleiche wie Magento 1

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

Dies funktioniert für jede Entität.

Gemäß der Antwort von @ Raphael funktioniert dies nicht für Verkaufsattribute.

Grundsätzlich ruft es die Funktion Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute () auf .

Dies akzeptiert zwei Parameter

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

Das erste $objectist ein Objekt, das aktualisiert werden muss, und der zweite Parameter $attributeCodeist der Code für das zu aktualisierende Attribut.


Es sollte grundsätzlich für jedes Unternehmen sein.
Kingshuk Deb

Ja, es funktioniert für jede Entität. Grundsätzlich Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()wird ein Aufruf aufgerufen, der ein Datenobjekt und einen Entitätscode akzeptiert.
Jaimin Sutariya

Upvoting, aber momentan nicht als Antwort akzeptieren. Ich werde überprüfen und aktualisieren.
Kingshuk Deb

Bitte gehen Sie zu Zeile 1608 in der Datei. (Magento 2.1.5) gibt es eine andere Funktionpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya

1
Magento scheint im Grunde alle wichtigen Funktionen intakt gehalten zu haben.
Kingshuk Deb

4

Nur um Jaimins Antwort zu verdeutlichen:

Dies funktioniert für jede Entität.

Das ist nicht wahr. Es funktioniert nur für EAV-Entitäten, die sich erweiternMagento\Eav\Model\Entity\AbstractEntity

Wenn Sie mit einer Nicht-EAV-Entität arbeiten, bei der das Ressourcenmodell erweitert Magento\Framework\Model\ResourceModel\Db\AbstractDbwird, müssen Sie die saveAttributeMethode in Ihrem Ressourcenmodell implementieren .

In Magento 2 haben sie es für die Magento\Sales\Model\ResourceModel\AttributeKlasse getan :

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

Im Falle eines Produkts können Sie das Massenaktionsobjekt verwenden. Zum Beispiel:

// 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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.