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 .

Kingshuk Deb
quelle

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.

Jaimin Sutariya
quelle
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;
}
Raphael beim digitalen Pianismus
quelle
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);
MagePsycho
quelle