如何只保存特定的属性值,而不是将整个产品保存在Magento2中


10

你们已经知道,我们过去在magento中使用以下方法来保存这样的特定属性值

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

要么

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

任何人都可以让我知道Magento2中上述方法替代方法

Answers:


8

与Magento 1相同

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

这将适用于任何实体。

按照@Raphael的回答,它不适用于销售属性。

基本上,它调用Magento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute()函数。

这将接受两个参数

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

首先$object是一个需要更新的对象,第二个参数$attributeCode是要更新的属性的代码。


它基本上应该适用于任何实体。
金舒克Deb

是的,它将适用于任何实体。它将基本上调用Magento\Eav\Model\Entity\AbstractEntity::saveAttribute()它将接受数据对象和实体代码。
Jaimin Sutariya

正在投票,但暂时不接受答案。我将检查并更新。
金舒克Deb

请转到文件中的1608行。(Magento 2.1.5)还有另一个功能public function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
Jaimin Sutariya

1
似乎magento基本上保留了所有重要功能。
金舒克Deb

4

只是为了澄清Jaimin的答案:

这将适用于任何实体。

这不是真的。仅适用于扩展了EAV实体的实体Magento\Eav\Model\Entity\AbstractEntity

如果要处理资源模型扩展Magento\Framework\Model\ResourceModel\Db\AbstractDb到的非EAV实体,则必须saveAttribute在资源模型中实现该方法。

在Magento 2中,他们已经完成了该Magento\Sales\Model\ResourceModel\Attribute课程:

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

对于产品,可以使用质量作用对象。例如:

// 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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.