製品全体を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上記の選択肢を

回答:


8

Magento 1と同じ

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

これはどのエンティティでも機能します。

@Raphaelの回答によると、それは販売属性には機能しません。

基本的にはMagento \ Eav \ Model \ Entity \ AbstractEntity :: saveAttribute()関数を呼び出します。

これは2つのパラメーターを受け入れます

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

1 $objectつ目は更新する必要があるオブジェクトで、2つ目$attributeCodeは更新する属性のコードです。


それは基本的にあらゆるエンティティのためのものであるべきです。
Kingshuk Deb 2017

はい、どのエンティティでも機能します。それは基本的にMagento\Eav\Model\Entity\AbstractEntity::saveAttribute()dataobjectとエンティティコードを受け入れるを呼び出します。
Jaiminスタリヤ2017

それを賛成しているが、今のところ回答として受け入れていない。確認して更新します。
Kingshuk Deb 2017

ファイルの1608行に移動してください。(Magento 2.1.5)別の機能がありますpublic function saveAttribute(\Magento\Framework\DataObject $object, $attributeCode)
ジャイミンスタリヤ2017

1
magentoは基本的にすべての重要な機能をそのまま維持しているようです。
Kingshuk Deb 2017

4

ジャイミンの答えを明確にするために:

これはどのエンティティでも機能します。

本当じゃない。拡張するEAVエンティティに対してのみ機能しますMagento\Eav\Model\Entity\AbstractEntity

リソースモデルが拡張される非EAVエンティティMagento\Framework\Model\ResourceModel\Db\AbstractDbを処理している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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.